24.10.2 机器学习入门DAY10

134 阅读5分钟

交叉验证(cross validation)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。

⽬的:为了让被评估的模型更加准确可信

问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?

解决方案:⽹格搜索(Grid Search)

⽹格搜索(Grid Search)

通常情况下,有很多参数是需要⼿动指定的(如k-近邻算法中的K值),这种叫超参数。但是⼿动过程繁杂,所以需要对模型预设⼏种超参数组合。每组超参数都采⽤交叉验证来进⾏评估。最后选出最优参数组合建⽴模型。

案例

from  sklearn.datasets import load_iris
from sklearn.model_selection import  train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


# 1.获取数据
iris = load_iris()

# 2.数据基本处理
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)

# 3.特征工程 - 特征预处理
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # 计算均值和标准差
x_test = transfer.transform(x_test)

# 4.机器学习-KNN
# 实例化一个估计器
estimator = KNeighborsClassifier()

# 模型调优 -- 交叉验证,网格搜索
param_grid = {"n_neighbors":[1,3,5,7]} # n_neighbors 是超参数
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)

# 模型训练
estimator.fit(x_train, y_train) # 进行模型训练

# 5.模型评估
# 预测值结果输出
y_pre = estimator.predict(x_test)
print("预测值是:\n", y_pre)
print("预测值和真实值的对比是:\n", y_pre==y_test)

# 准确率计算
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

print("交叉验证中,得到的最好结果是:\n", estimator.best_score_)
print("交叉验证中,得到的最好结果是:\n", estimator.best_estimator_)
print("交叉验证中,得到的最好结果是:\n", estimator.cv_results_)

线性回归

线性回归(Linear regression)是利⽤回归⽅程(函数)对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的 ⼀种分析⽅式。

特点:只有⼀个⾃变量的情况称为单变量回归,多于⼀个⾃变量情况的叫做多元回归

image.png

# 导入模块
from sklearn.linear_model import LinearRegression

# 构造数据集
x = [[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]

# 机器学习-训练模型
# 实例化API
estimator = LinearRegression()
# 使⽤fit⽅法进⾏训练
estimator.fit(x,y)
# 打印对应的系数
print("线性回归的系数是:", estimator.coef_) # 线性回归的系数是: [0.3 0.7]

# 打印对应的系数
print("输出预测结果是:", estimator.predict([[100,  80]])) # 输出预测结果是: [86.]

线性关系 单变量线性关系: 多变量线性关系: 注释:单特征与⽬标值的关系呈直线关系,或者两个特征与⽬标值呈现平⾯的关系 ⾮线性关系 损失函数

image.png y 为第i个训练样本的真实值 h(x )为第i个训练样本特征值组合预测函数 ⼜称最⼩⼆乘法

优化算法 法一: 正规⽅程 image.png X为特征值矩阵,y为⽬标值矩阵。直接求到最好的结果缺点:当特征过多过复杂时,求解速度太慢并且得不到结果

正规⽅程的推导: image.png

其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵对其求解关于w的最⼩值,起⽌y,X 均已知⼆次函数直接求导,导数为零的位置,即为最⼩值。

image.png

梯度下降(Gradient Descent)

image.png

在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率;在多变量函数中,梯度是⼀个向量,向量有⽅向,梯度的⽅向就指出了函数在给定点的上升最快的⽅向;

梯度下降和正规⽅程的对⽐

image.png

最⼩⼆乘法的局限性。⾸先,最⼩⼆乘法需要计算X转置与X的乘积的逆矩阵,有可能它的逆矩阵不存在,这样就没有办法直接⽤最⼩⼆乘法了。此时就需要使⽤梯度下降法。当然,我们可以通过对样本数据进⾏整理,去掉冗余特征。X转置与X的乘积的逆矩阵的⾏列式不为0,然后继续使⽤最⼩⼆乘法。第⼆,当样本特征n⾮常的⼤的时候,计算X转置与X的乘积的逆矩阵是⼀个⾮常耗时的⼯作(nxn的矩阵求逆),甚⾄不可⾏。此时以梯度下降为代表的迭代法仍然可以使⽤。那这个n到底多⼤就不适合最⼩⼆乘法呢?如果你没有很多的分布式⼤数据计算资源,建议超过10000个特征就⽤迭代法吧。或者通过主成分分析降低特征的维度后再⽤最⼩⼆乘法。第三,如果拟合函数不是线性的,这时⽆法使⽤最⼩⼆乘法,需要通过⼀些技巧转化为线性才能使⽤,此时梯度下降仍然可以⽤。第四,以下特殊情况,。当样本量m很少,⼩于特征数n的时候,这时拟合⽅程是⽋定的,常⽤的优化⽅法都⽆法去拟合数据。当样本量m等于特征数n的时候,⽤⽅程组求解就可以了。当m⼤于n时,拟合⽅程是超定的,也就是我们常⽤与最⼩⼆乘法的场景了。

算法选择依据 ⼩规模数据: 正规⽅程:LinearRegression(不能解决拟合问题) 岭回归

⼤规模数据: 梯度下降法:SGDRegressor(待深入学习该部分!)

⽋拟合和过拟合

慢慢学习相关算法中。。。