1. 什么是交叉验证
所谓交叉验证指的是将样本分为两组,一组为训练样本,一组为测试样本;对于哪些数据分为训练样本,哪些数据分为测试样本,进行多次拆分,每次将整个样本进行不同的拆分,对这些不同的拆分每个拆分都有一个打分或者损失,将这些打分或者损失进行平均形成一个平均打分或者平均损失。
2. 不使用交叉验证(即没有对样本进行多次不同的分组)
例如:
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print(knn.score(X_test, y_test))
3. 使用交叉验证
例如:
from sklearn.cross_validation import cross_val_score knn = KNeighborsClassifier(n_neighbors=5) scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy') print(scores)
上述代码将样本进行了5次不同的拆分,并得到5次拆分的打分列表
3. 使用交叉验证并获取进行多少次不同分组得到的结果最优
结果最优指的是打分最高或者损失最低
将分组次数从1到n进行循环,获取平均打分或者平均损失,形成折线图
from sklearn.cross_validation import cross_val_score 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') # for regression scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') # for classification 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()