测试两个算法应用到同一个测试集上的表现以及对参数的调整
1.数据加载
from sklearn.datasets import load_digits
data = load_digits()
X,y=data.data,data.target #y为数据的实际值
2.可视化表示
f,axes = plt.subplots(1,4,sharey=True,figsize(16,6))
for i in range(4):
axes[i].imshow(X[i,:].reshape([8,8]),cmap='Greys') #画出前个数字图像
3.划分数据集合留置集
X_train, X_holdout, y_train, y_holdout = train_test_split(
X, y, test_size=0.3, random_state=17) #7:3
4.使用随机参数训练决策树和KNN
tree = DecisionTreeClassifier(max_depth=5, random_state=17) #深度为5
knn_pipe = Pipeline([('scaler', StandardScaler()), #StandardScaler数据归一化
('knn', KNeighborsClassifier(n_neighbors=10))])
tree.fit(X_train, y_train) #决策树开始训练,y_train为数值标签
knn_pipe.fit(X_train, y_train)
5.开始预测
tree_pred = tree.predict(X_holdout) #在决策树上预测
knn_pred = knn_pipe.predict(X_holdout) #KNN上预测
accuracy_score(y_holdout, knn_pred),accuracy_score(y_holdout, tree_pred) #KNN上的正确率:0.976, 决策树上的正确率:0.666)
6.由上面的结果可知,KNN的效果更好,但是设置的是随机参数。现在使用交叉验证调优解决决策树模型。
tree_params = {'max_depth': [10, 20, 30], #将这三个深度拿到模型中训练,找到分类情况最好的那一个
'max_features': [30, 50, 64]}
tree_grid = GridSearchCV(tree, tree_params, #tree ->模型名 tree_paramas+>训练的参数,n_jobs->并行数,这里-1代表和CPU统一
cv=5, n_jobs=-1, verbose=True) #verbose=True 日志跟踪,cv->验证折数
tree_grid.fit(X_train, y_train)
7.查看交叉验证得到的最佳参数组合和相应的准确率
tree_grid.best_params_, tree_grid.best_score_
>>({'max_depth': 10, 'max_features': 50}, 准确率:0.8568203376968316)
8.对KNN进行交叉验证
np.mean(cross_val_score(KNeighborsClassifier(
n_neighbors=1), X_train, y_train, cv=5))
>> 0.98648680282
7.在这一数据集上训练随机森林模型,在大多数数据集上,随机森林的效果比 KNN好
np.mean(cross_val_score(RandomForestClassifier(
random_state=17), X_train, y_train, cv=5))
>>0.9753456
但是从这个数据集中,随机森林的准确率不如KNN的高,