交叉验证
cross_val_score
cross_val_score 是 Scikit-learn 中的一个函数,用于执行交叉验证(cross-validation),它可以帮助评估模型的泛化能力。交叉验证是一种常见的模型评估方法,通过将数据集分成多个训练和测试集,避免模型过拟合并评估它在不同数据划分上的表现。
使用及常见参数
from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator, X, y, cv=5, scoring='accuracy')
- estimator:你要评估的模型,例如 SGDClassifier、RandomForestClassifier 等。它需要实现 fit 和 predict 方法。
- X:特征矩阵,包含训练数据的特征。
- y:标签数组,包含训练数据的目标值(标签)。
- cv:指定交叉验证的折数(默认值是 5)。cv=5 表示将数据分成 5 份,其中 4 份用于训练,1 份用于验证,交叉验证会重复 5 次,每次使用不同的验证集。
- scoring:评估指标,决定了使用什么方法来评估模型的性能。例如,'accuracy' 表示使用准确率来评估模型。其他常见选项包括 'precision'、'recall'、'f1' 等。
除了上述调用corss_val_score的方式外,我们还可以自定义地对数据进行切分,这时候需要用到StratifiedKFold
from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone
skflods = StratifiedKFold(n_splits=3, shuffle=True, random_state=42) # n_splits表示将数据切成几份,默认值是3
for train_index, test_index in skflods.split(X_train, y_train_5):
clone_clf = clone(sgd_clf)
X_train_flods = X_train[train_index]
y_train_flods = y_train_5[train_index]
X_test_flods = X_train[test_index]
y_test_flods = y_train_5[test_index]
clone_clf.fit(X_train_flods, y_train_flods)
y_pred = clone_clf.predict(X_test_flods)
num_correct = sum(y_pred == y_test_flods)
print(num_correct / len(y_pred))
简单来说,StratifiedKFold 是一种手动控制交叉验证的划分方式,而 cross_val_score 是一个高层次的封装函数,它可以自动执行交叉验证并返回评分结果。
线性回归
在接下来的代码中我们将会随机生成数据,在此之前先简单介绍一下一些随机数生成器。
np.random.rand:生成 [0,1) 范围之间的随机数
np.random.rand(d0, d1, ..., dn) # d0, d1, ..., dn是每个维度的大小
np.random.randn:生成服从标准正态分布的随机数,均值为0,标准差为1
np.random.randn(d0, d1, ..., dn)
现在开始进行梯度下降算法的演示,首先我们需要获取数据,通过刚刚说的 np.random.rand 来随机生成100个特征x,以及我们自定义相对应的y
import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')
X = 2 * np.random.rand(100, 1) # 构造一个 100 × 1的矩阵
y = 3 * X + 4 + np.random.randn(100, 1)
我们可以将数据画出来方便我们查看
plt.plot(X, y, 'b.')
plt.xlabel('X_1')
plt.ylabel('y')
plt.axis([0, 2, 0, 15])
plt.show()
现在我们已经有了数据,现在要做的就是寻找合适的参数使得成功构建出一个model用来预测数据
参数直接求解
X_b = np.c_[np.ones((100, 1)), X] # 在原来特征前都加一列 1
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best) # 第 0 位表示偏置项 b,第 1 位表示权重项 w
print(theta_best.shape)
现在我们得到了参数矩阵 \(theta\)_\(best\),可以做出一些预测看看它准不准
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
# print(X_new_b)
# print(print(X_new_b.shape))
y_predict = X_new_b.dot(theta_best)
print(y_predict)
画图如下:
plt.plot(X_new, y_predict, 'r--')
plt.plot(X, y, 'b.')
plt.xlabel('X_1')
plt.ylabel('y')
plt.axis([0, 2, 0, 15])
plt.show()
以上方法虽然可以通过数学公式一步到位计算参数矩阵,但是并非在所有情况下都适用,比如有时候矩阵并不能求逆,更重要的是这没有体现出机器学习中的‘学习’二字。
因此我们需要用到 梯度下降。
批量梯度下降
eta = 0.1
n_iterations = 1000
m = 100 # 样本个数,即之前定义的 100 * 1的矩阵
theta = np.random.randn(2, 1) # 随机初始化一个权重矩阵
for i in range(n_iterations):
gradients = 1/m * X_b.T.dot(X_b.dot(theta) - y)
theta -= eta * gradients
print(theta)
打印出 \(theta\)可以发现和之前用公式求出来的 \(theta\)_\(best\) 是一样的。
非常方便的是,scikit-learn中已经包含了一个叫 LinearRegression 的类,可以通过拟合数据来找到最优的回归模型。使用方法如下:
from sklearn.linear_model import LinearRegression
# X = 2 * np.random.rand(100, 1) # 构造一个 100 × 1的矩阵
# y = 3 * X + 4 + np.random.randn(100, 1)
lin_reg = LinearRegression()
lin_reg.fit(X, y)
w = lin_reg.coef_ # 模型中每个特征的权重
b = lin_reg.intercept_ # 模型的截距,即偏置项
print(w)
print(b)
标签:plt,random,Machine,print,train,Learning,theta,np,旅途
From: https://www.cnblogs.com/Kenny-Huang/p/18410918