机器学习——模型参数调优

一个模型是否适用或者效果如何很大程度上取决于超参数的设置,通过对超参数进行调优可以优化模型,提高模型性能。
超参数调优主要有以下几种方法:

1、网格搜索(grid search)

Grid search 是一种暴力的调参方法,通过遍历所有可能的参数值以获取所有所有参数组合中最优的参数组合。

如果采用较大的搜索范围以及较小的步长,网格搜索有很大概率找到全局最优值。然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。因此,在实际应用中,网格搜索法一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。
代码实例:
采用威斯康星乳腺癌数据进行建模分析
kaggle平台可直接获取数据:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
查看下数据的基本情况

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('../input/breast-cancer-wisconsin-data/data.csv')
data.head()

output:
机器学习——模型参数调优_第1张图片
其中列diagnosis代表诊断结果(M:恶性,B:良性),其余列(除Id之外)代表从每个细胞核中计算得到的相关特征。首先需要对数据进行预处理,切分出特征数据和目标变量,并对分类变量进行编码处理,由于关注结果为恶性,M:1,B:0

from sklearn.preprocessing import LabelEncoder
Encoder = LabelEncoder()
data['diagnosis'] = Encoder.fit_transform(data['diagnosis'])
data['diagnosis'].value_counts()

output:

0    357
1    212
Name: diagnosis, dtype: int64

使用网格搜索对逻辑回归算法进行超参数调优:

y = data['diagnosis']
x = data.drop(['id','diagnosis','Unnamed: 32'],axis =1)
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
train_X,val_X,train_y,val_y = train_test_split(x,y,test_size=0.2,random_state=1)
pipe_lr = Pipeline([('scl',StandardScaler()),('clf',LogisticRegression(random_state=0))])
param_range=[0.0001,0.001,0.01,0.1,1,10,100,1000]
param_penalty=['l1','l2']
param_grid=[{'clf__C':param_range,'clf__penalty':param_penalty}]
gs = GridSearchCV(estimator=pipe_lr,
                 param_grid=param_grid,
                 scoring='f1',
                 cv=10,
                 n_jobs=-1)
gs = gs.fit(train_X,train_y)
print(gs.best_score_)
print(gs.best_params_)

output:

0.9700631068278126
{'clf__C': 0.1, 'clf__penalty': 'l2'}

可以看到C值和penalty的最优组合是0.1和 l 2 l2 l2

使用网格搜索对随机森林算法进行超参数调优:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
rfc = RandomForestClassifier(random_state=1)
rfc_grid = {'n_estimators':[5,10,15,20,25],'max_depth':[1,2,3,4,5,6,7,8,9,None]}
rfc_gs = GridSearchCV(estimator=rfc,
                      param_grid=rfc_grid,
                      scoring='f1')
rfc = rfc_gs.fit(train_X,train_y)
print(rfc.best_score_)
print(rfc.best_params_)

output:

0.9446827070169245
{'max_depth': 6, 'n_estimators': 25}

可看到最有参数组合为:max_depth=6,n_estimators=25

你可能感兴趣的:(机器学习)