当前位置 博文首页 > fenfyue的博客:【决策树andKNN】——实现手写数字的识别

    fenfyue的博客:【决策树andKNN】——实现手写数字的识别

    作者:[db:作者] 时间:2021-08-19 21:53

    测试两个算法应用到同一个测试集上的表现以及对参数的调整

    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的高,

    cs