zoukankan      html  css  js  c++  java
  • 网格搜索与交叉验证

    一. 网格搜索验证

    sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)

    2. 常用方法和属性

    • grid.fit():运行网格搜索
    • best_params_:描述了已取得最佳结果的参数的组合
    • best_score_:提供优化过程期间观察到的最好的评分
    • feature_importances_: 提供所有特征重要程度的分数

    3. 使用示例(以RandomForestClassifier为例, 其它的分类模型也能按这个方法调参)

    • 1. 先寻找最优RF的n_estimators参数
    1 param_test1 = {'n_estimators':[50,120,160,200,250]}
    2 gsearch1 = GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,
    3 min_samples_leaf=20,max_depth=8,max_features='sqrt' ,random_state=10), 
    4 param_grid = param_test1, scoring='roc_auc',cv=5)
    5 gsearch1.fit(x_train,y_train)
    6 print( gsearch1.best_params_, gsearch1.best_score_) # 得到最优n_estimators参数
    • 2. 接着寻找最优决策树最大深度max_depth
    1 param_test2 = {'max_depth':[1,2,3,5,7,9,11,13]}#, 'min_samples_split':[100,120,150,180,200,300]}
    2 gsearch2 = GridSearchCV(estimator = RandomForestClassifier(n_estimators=50, min_samples_split=100,
    3 min_samples_leaf=20,max_features='sqrt' ,oob_score=True, random_state=10),
    4 param_grid = param_test2, scoring='roc_auc',iid=False, cv=5)
    5 gsearch2.fit(x_train,y_train)
    6 print( gsearch2.best_params_, gsearch2.best_score_)    # 得到最优max_depth参数
    • 3. 对于RF分类器, 可以看看现在模型的袋外分数
    1 rf1 = RandomForestClassifier(n_estimators= 50, max_depth=2, min_samples_split=100, 
    2 min_samples_leaf=20,max_features='sqrt',oob_score=True, random_state=10)
    3 rf1.fit(x_train,y_train)
    4 print( rf1.oob_score_) # 打印袋外分数
    #假设输出结果为0.984, 默认情况为0.972
    #相对于默认情况,袋外分数有提高,也就是说模型的泛化能力变好了
    • 4. 继续如此循环调整可以得到最优参数组合

    二. 交叉验证

    • 示例
     1 from sklearn.neighbors import KNeighborsClassifier
     2 from sklearn.model_selection import cross_val_score
     3 
     4 k_range = [1, 5, 9, 15]
     5 cv_scores = []
     6 for k in k_range:
     7 knn = KNeighborsClassifier(n_neighbors=k)
     8 scores = cross_val_score(knn, X_train, y_train, cv=5)
     9 cv_score = np.mean(scores)
    10 print('k={},验证集上的准确率={:.3f}'.format(k, cv_score))
    11 cv_scores.append(cv_score)
    12 # k=1,验证集上的准确率=0.947
    13 # k=5,验证集上的准确率=0.955
    14 # k=9,验证集上的准确率=0.964
    15 # k=15,验证集上的准确率=0.964
    16 
    17 best_k = k_range[np.argmax(cv_scores)] # 从交叉验证中的最优score中取出最优参数, 代入模型重新fit,score
    18 best_knn = KNeighborsClassifier(n_neighbors=best_k)
    19 best_knn.fit(X_train, y_train)
    20 print('测试集准确率:', best_knn.score(X_test, y_test))
    21 # 测试集准确率: 0.9736842105263158
  • 相关阅读:
    替换Srun3000解决掉网问题
    了解Equals所发生的事情
    WPF自定义TextBox及ScrollViewer
    自制多类编码转换工具
    .NET4.5之自制多LRC转SRT小工具
    JAVA_list总结
    记一次线程Timer导致的线程安全问题修正
    JAVA_匿名内部类
    JAVA_map总结
    JAVA_闭包
  • 原文地址:https://www.cnblogs.com/Alexisbusyblog/p/12403381.html
Copyright © 2011-2022 走看看