本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Trick:纯demo,心在哪里,结果就在那里
# -*- coding: utf-8 -*-
# Author : szy
# Create Date : 2019/10/28
"""
知识点1:正规化 Normalization
由于资料的偏差与跨度会影响机器学习的成效,因此正规化(标准化)数据可以提升机器学习的成效。
"""
#1.数据标准化
from sklearn import preprocessing #标准化数据模块
import numpy as np
#建立Array
a = np.array([[10, 2.7, 3.6],
[-100, 5, -2],
[120, 20, 40]], dtype=np.float64)
#将normalized后的a打印出
# print(preprocessing.scale(a))
"""
[[ 0. -0.85170713 -0.55138018]
[-1.22474487 -0.55187146 -0.852133 ]
[ 1.22474487 1.40357859 1.40351318]]
"""
#2.数据标准化对机器学习成效的影响
#加载模块
# 标准化数据模块
from sklearn import preprocessing
import numpy as np
# 将资料分割成train与test的模块
from sklearn.model_selection import train_test_split
# 生成适合做classification资料的模块
from sklearn.datasets.samples_generator import make_classification
# Support Vector Machine中的Support Vector Classifier
from sklearn.svm import SVC
# 可视化数据的模块
import matplotlib.pyplot as plt
#生成适合做Classification数据
#生成具有2种属性的300笔数据
X, y = make_classification(
n_samples=300, n_features=2,
n_redundant=0, n_informative=2,
random_state=22, n_clusters_per_class=1,
scale=100)
#可视化数据
# plt.scatter(X[:, 0], X[:, 1], c=y)
# plt.show()
#数据标准化前
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(X_train, y_train)
# print(clf.score(X_test, y_test))
# 标准化前的预测准确率只有0.477777777778
# 0.477777777778
# 数据标准化后
# 数据的单位发生了变化, X 数据也被压缩到差不多大小范围.
X = preprocessing.scale(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(X_train, y_train)
# print(clf.score(X_test, y_test))
# 标准化后的预测准确率提升至0.9
# 0.9888888888888889
"-------------------------------------------------------------------------"
"""
知识点2:检验神经网络 (Evaluation)
在神经网络的训练当中, 神经网络可能会因为各种各样的问题, 出现学习的效率不高,
或者是因为干扰太多, 学到最后并没有很好的学到规律 . 而这其中的原因可能是多方面的,
可能是数据问题, 学习效率 等参数问题.
1,Training and Test data
为了检验,评价神经网络, 避免和改善这些问题, 我们通常会把收集到的数据分为训练数据 和 测试数据,
一般用于训练的数据可以是所有数据的70%, 剩下的30%可以拿来测试学习结果.如果你想问为什么要分开
成两批, 那就想想我们读书时的日子, 考试题和作业题大部分都是不一样的吧.这也是同一个道理.
2.误差曲线
评价机器学习可以从误差这个值开始, 随着训练时间的变长, 优秀的神经网络能预测到更为精准的答案,
预测误差也会越少 . 到最后能够提升的空间变小, 曲线也趋于水平
3.准确度曲线
除了误差曲线, 我们可以看他的精确度曲线. 最好的精度是趋向于100%精确.
比如在神经网络的分类问题中, 100个样本中, 我有90张样本分类正确, 那就是说我的预测精确度是90%.
不过, 不知道大家有没有想过对于回归的问题呢? 怎样看预测值是连续数字的精确度?
这时, 我们可以引用 R2 分数在测量回归问题的精度 . R2给出的最大精度也是100%,
所以分类和回归就都有的统一的精度标准.
除了这些评分标准, 我们还有很多其他的标准, 比如 F1 分数 , 用于测量不均衡数据的精度.
4.正规化
意外是猝不及防的, 比如有时候我们明明每一道作业习题都会做, 可是考试分数为什么总是比作业分数低许多?
原来, 我们只复习了作业题,并没有深入, 拓展研究作业反映出来的知识. 这件事情发生在机器学习中, 我们就叫做过拟合
在机器学习中, 解决过拟合也有很多方法 , 比如 l1, l2 正规化, dropout 方法.
5.交叉验证 (Cross-validation)
神经网络也有很多参数, 我们怎么确定哪样的参数能够更有效的解决现有的问题呢? 这时, 交叉验证 就是最好的途径了.
交叉验证不仅仅可以用于神经网络的调参, 还能用于其他机器学习方法的调参. 同样是选择你想观看的误差值或者是精确度,
不过横坐标不再是学习时间, 而是你要测试的某一参数 (比如说神经网络层数) . 我们逐渐增加神经层, 然后对于每一个不
同层结构的神经网络求出最终的误差或精度, 画在图中. 我们知道, 神经层越多, 计算机所需要消耗的时间和资源就越多,
所以我们只需要找到那个能满足误差要求, 有节约资源的层结构. 比如说误差在0.005一下都能接受 , 那我们就可以采用
30层的神经网络结构 .
"""
#5.1.1,Model 基础验证法
from sklearn.datasets import load_iris # iris数据集
from sklearn.model_selection import train_test_split # 分割数据模块
from sklearn.neighbors import KNeighborsClassifier # K最近邻(kNN,k-NearestNeighbor)分类算法
#加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
#分割数据并
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
#建立模型
knn = KNeighborsClassifier()
#训练模型
knn.fit(X_train, y_train)
#将准确率打印出
# print(knn.score(X_test, y_test))
# 可以看到基础验证的准确率
# 0.9736842105263158
# 5.1.2,Model 交叉验证法(Cross Validation)
from sklearn.model_selection import train_test_split,StratifiedKFold,cross_val_score
# from sklearn.cross_validation import cross_val_score # K折交叉验证模块,,这样导包出现错误,用上面那个,sklearn版本问题
#使用K折交叉验证模块
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
#将5次的预测准确率打印出
# print(scores)
# [ 0.96666667 1. 0.93333333 0.96666667 1. ]
#将5次的预测准确平均率打印出
# print(scores.mean())
# 0.9733333333334
#5.1.3,以准确率(accuracy)判断
# 一般来说准确率(accuracy)会用于判断分类(Classification)模型的好坏。
import matplotlib.pyplot as plt #可视化模块
#建立测试参数集
k_range = range(1, 31)
k_scores = []
#藉由迭代的方式来计算不同参数对模型的影响,并返回交叉验证后的平均准确率
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
k_scores.append(scores.mean())
#可视化数据
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
# plt.show()
# 从图中可以得知,选择12~18的k值最好。高过18之后,准确率开始下降则是因为过拟合(Over fitting)的问题。
# 5.1.4,以平均方差(Mean squared error)
# 一般来说平均方差(Mean squared error)会用于判断回归(Regression)模型的好坏。
# scoring='mean_squared_error报错无解
import matplotlib.pyplot as plt
k_range = range(1, 31)
k_scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
# loss = -cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error')
loss = -cross_val_score(knn, X, y, cv=10, scoring=None)
k_scores.append(loss.mean())
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated MSE')
plt.show()
# 由图可以得知,平均方差越低越好,因此选择13~18左右的K值会最好。
# 5.2.1,Learning curve 检视过拟合
# sklearn.learning_curve 中的 learning curve 可以很直观的看出我们的 model 学习的进度,
# 对比发现有没有 overfitting 的问题. 然后我们可以对我们的 model 进行调整, 克服 overfitting 的问题.
# from sklearn.learning_curve import learning_curve #学习曲线模块 导入如下,莫烦大佬的版本问题
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits #digits数据集
from sklearn.svm import SVC #Support Vector Classifier
import matplotlib.pyplot as plt #可视化模块
import numpy as npe
# 加载digits数据集,其包含的是手写体的数字,从0到9。数据集总共有1797个样本,每个样本由64个特征组成,
# 分别为其手写体对应的8×8像素表示,每个特征取值0~16。
digits = load_digits()
X = digits.data
y = digits.target
# 观察样本由小到大的学习曲线变化, 采用K折交叉验证 cv=10, 选择平均方差检视模型效能 scoring='mean_squared_error',
# 样本由小到大分成5轮检视学习曲线(10%, 25%, 50%, 75%, 100%):
train_sizes, train_loss, test_loss = learning_curve(
SVC(gamma=0.001), X, y, cv=10, scoring='mean_squared_error',
train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
#平均每一轮所得到的平均方差(共5轮,分别为样本10%、25%、50%、75%、100%)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)
# 可视化图形:
plt.plot(train_sizes, train_loss_mean, 'o-', color="r",
label="Training")
plt.plot(train_sizes, test_loss_mean, 'o-', color="g",
label="Cross-validation")
plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()
# 5.3.1,validation_curve 检视过拟合
# 交叉验证(cross validation)让我们知道在机器学习中验证是有多么的重要,
# 这一次的 sklearn 中我们用到了sklearn.learning_curve当中的另外一种,
# 叫做validation_curve,用这一种曲线我们就能更加直观看出改变模型中的
# 参数的时候有没有过拟合(overfitting)的问题了. 这也是可以让我们更好的选择参数的方法.
# validation_curve 检视过拟合
# 继续上一个的例子,并稍作小修改即可画出图形。这次我们来验证SVC中的一个参数
# gamma 在什么范围内能使 model 产生好的结果. 以及过拟合和 gamma 取值的关系.
from sklearn.learning_curve import validation_curve #validation_curve模块
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
#digits数据集
digits = load_digits()
X = digits.data
y = digits.target
#建立参数测试集
param_range = np.logspace(-6, -2.3, 5)
#使用validation_curve快速找出参数对模型的影响
train_loss, test_loss = validation_curve(
SVC(), X, y, param_name='gamma', param_range=param_range, cv=10, scoring='mean_squared_error')
#平均每一轮的平均方差
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)
#可视化图形
plt.plot(param_range, train_loss_mean, 'o-', color="r",
label="Training")
plt.plot(param_range, test_loss_mean, 'o-', color="g",
label="Cross-validation")
plt.xlabel("gamma")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()
# 由图中可以明显看到gamma值大于0.001,模型就会有过拟合(Overfitting)的问题。