0


python机器学习从入门到高级:超参数调整(含详细代码)

Python机器学习之超参数调整

  • 🌸个人主页:JoJo的数据分析历险记
  • 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏

文章目录

在我们选择好一个模型后,接下来要做的是如何提高模型的精度。因此需要进行超参数调整,一种方法是手动调整

  1. 超参数

,直到找到超参数值的最佳组合。这将是一个非常复杂的工作,我们可以通过

  1. sklearn

中的一些方法来进行搜索。我们所需要做的就是告诉它我们想用哪些超参数进行实验,以及尝试哪些值,然后它将使用交叉验证来评估所有可能的超参数值组合。

💮1 使用GridSearchCV

  • 这种方法就是通过不断搜索匹配选出最好的超参数

具体代码如下

  1. # 导入所需库import numpy as np
  2. from sklearn import linear_model, datasets
  3. from sklearn.model_selection import GridSearchCV
  1. # 加载数据
  2. iris = datasets.load_iris()
  3. features = iris.data
  4. target = iris.target
  1. # 创建模型
  2. logistic = linear_model.LogisticRegression()

logistic回归有两个参数,一个是正则化惩罚的方式

  1. L1

,

  1. L2

还有一个是正则化系数

  1. C
  1. penalty =['l1','l2']
  1. C = np.logspace(0,4,10)
  1. hyperparameters =dict(C=C, penalty=penalty)
  1. # 创建网格搜索对象
  2. gridsearch = GridSearchCV(logistic, hyperparameters, cv=5)

默认情况下,在找到最佳超参数之后,GridSearchCV将使用最佳超参数和整个数据集重新训练模型

  1. best_model = gridsearch.fit(features, target)

下面我们来看一下最优的具体超参数

  1. best_model.best_estimator_.get_params()
  1. {'C': 7.742636826811269,
  2. 'class_weight': None,
  3. 'dual': False,
  4. 'fit_intercept': True,
  5. 'intercept_scaling': 1,
  6. 'l1_ratio': None,
  7. 'max_iter': 100,
  8. 'multi_class': 'auto',
  9. 'n_jobs': None,
  10. 'penalty': 'l2',
  11. 'random_state': None,
  12. 'solver': 'lbfgs',
  13. 'tol': 0.0001,
  14. 'verbose': 0,
  15. 'warm_start': False}

正则化系数取

  1. C:7.74

,惩罚项选择

  1. L2正则化
  1. best_model.predict(features)
  1. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  2. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3. 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  4. 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
  5. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  6. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  7. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

🍁2.使用随机搜索选择模型

当您探索相对较少的组合时,网格搜索方法很好,如前一个示例中所示,但当超参数搜索空间较大时,通常最好使用

  1. randomizedsearchcv

。该类的使用方式与GridSearchCVclass大致相同,但它不是尝试所有可能的组合,而是评估给定的通过在每次迭代中为每个HyperParameter选择一个随机值来计算随机组合的数量。这种方法有两个主要好处

  • 如果让随机搜索运行1000次迭代,这种方法将为每个超参数探索1000个不同的值(而不是网格搜索方法中每个超参数只有几个值)。
  • 只需设置迭代次数,就可以更好地控制要分配给hyperparametersearch的计算预算
  1. from sklearn.model_selection import RandomizedSearchCV
  2. from scipy.stats import uniform
  1. #c来自一个均匀分布
  2. c = uniform(loc=0, scale=4)
  1. hyperparameters =dict(C=c, penalty=penalty)
  1. randomizedsearchCV = RandomizedSearchCV(logistic, hyperparameters, random_state=1, n_iter=100, cv=5)
  1. best_model = randomizedsearchCV.fit(features, target)
  1. best_model.best_estimator_.get_params()
  1. {'C': 1.668088018810296,
  2. 'class_weight': None,
  3. 'dual': False,
  4. 'fit_intercept': True,
  5. 'intercept_scaling': 1,
  6. 'l1_ratio': None,
  7. 'max_iter': 100,
  8. 'multi_class': 'warn',
  9. 'n_jobs': None,
  10. 'penalty': 'l1',
  11. 'random_state': None,
  12. 'solver': 'warn',
  13. 'tol': 0.0001,
  14. 'verbose': 0,
  15. 'warm_start': False}

可以看到此时最优超参数为

  1. C1.67

  1. 正则化方式选L1

🏵️3.从多种学习算法中选择最佳模型

  1. from sklearn.ensemble import RandomForestClassifier
  2. from sklearn.pipeline import Pipeline
  3. from sklearn.linear_model import LogisticRegression
  1. np.random.seed(10)
  1. iris = datasets.load_iris()
  1. search_space =[{'classifier':[LogisticRegression()],'classifier__penalty':['l1','l2'],'classifier__C': np.logspace(0,4,10)},{'classifier':[RandomForestClassifier()],'classifier__n_estimators':[10,100,1000],'classifier__max_features':[1,2,3]}]
  1. gridsearch = GridSearchCV(pip, search_space, cv=5)
  1. best_model = gridsearch.fit(features, target)
  1. best_model.best_estimator_.get_params()
  1. {'memory': None,
  2. 'steps': [('classifier', LogisticRegression(C=7.742636826811269))],
  3. 'verbose': False,
  4. 'classifier': LogisticRegression(C=7.742636826811269),
  5. 'classifier__C': 7.742636826811269,
  6. 'classifier__class_weight': None,
  7. 'classifier__dual': False,
  8. 'classifier__fit_intercept': True,
  9. 'classifier__intercept_scaling': 1,
  10. 'classifier__l1_ratio': None,
  11. 'classifier__max_iter': 100,
  12. 'classifier__multi_class': 'auto',
  13. 'classifier__n_jobs': None,
  14. 'classifier__penalty': 'l2',
  15. 'classifier__random_state': None,
  16. 'classifier__solver': 'lbfgs',
  17. 'classifier__tol': 0.0001,
  18. 'classifier__verbose': 0,
  19. 'classifier__warm_start': False}

对于该数据集,上述结果表明使用logistic回归的效果比随机森林更好

本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!


本文转载自: https://blog.csdn.net/weixin_45052363/article/details/124574467
版权归原作者 JoJo的数据分析历险记 所有, 如有侵权,请联系我们删除。

“python机器学习从入门到高级:超参数调整(含详细代码)”的评论:

还没有评论