0%

sklearn.model_selection

整理sklearn.model_selection中一些常用的类及其基本用法。

拆分数据(sklearn.model_selection.train_test_split)

用于将数据集拆分为两部分,一部分用于模型训练,一部分用于模型评估。

train_test_split(*arrays, test_size=0.25, train_size=None, random_state=None, shuffle=True, stratify=None)
*arrays 相同长度的一系列n个数据集,接受格式有[lists, numpy arrays, scipy-sparse matrices or pandas dataframes]。返回2n个数据集,一个输入对应两个输出。
test_size=0.25 整数或小数。代表个数或比例
train_size=None 同上,两个_size指定一个就好了
random_state=None 随机数种子
shuffle=True 拆分前是否打乱数据。If shuffle=False then stratify must be None.
stratify=None

1
2
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

网格搜索(sklearn.model_selection.GridSearchCV)

这个呢,hei好用,可以便捷的帮我们确定最优参数,并且设置好需要训练的模型还有对应的参数,会在每一组参数进行训练,然后使用最优的一组参数来训练最终的模型,设置起来也不复杂。

GridSearchCV(estimator, paramgrid, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=’2*n_jobs’, error_score=’raise-deprecating’, return_train_score=’warn’)
estimator 学习器接口,设定用于训练模型的算法,比如 sklearn.svm.SVR()。需要有 scoring 参数,否则不对模型进行评估
param_grid 参数网格,传入字典或 value为列表的字典。e.g. {‘C’: [1, 10, 100]}
scoring=None 模型的评分方式,如果为 None,则使用模型默认的度量。可以是字符串、可调用对象、列表 / 元组、字典。
fit_params=None 传给fit方法的参数
n_jobs=None 并行作业数
iid='warn' (Changed in version 0.20: Parameter iid will change from True to False by default in version 0.22, and will be removed in 0.24)
refit=True 是否在整个数据集上使用得到的最佳参数重新训练。
cv='warn' 交叉验证策略,默认为 3折交叉验证。
verbose=0 控制冗余,越高,信息越多。
pre_dispatch='2*n_jobs' 控制并行作业期间分配的作业数量,可以是 int、str(关于 n_jobs的函数表达式)。
error_score='raise-deprecating' 如果训练出错返回的分数。
return_train_score='warn' 如果 False,cv_results
属性不包含分数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection.GridSearchCV
from sklearn.svm import SVC

model = SVC()
param_range = {'C': [1, 10, 100]}
clf = GridSearchCV(model, param_range, scoring='roc_auc', cv=10, verbose=1, n_jobs=4)
clf.fit(X_train, y_train)

y_pre = clf.predict(X_test)
clf.score(X_test, y_test)

clf.cv_results_ #可以转化为DataFrame格式的字典,keys是列名称,values是对应的列
clf.best_score_ #最高得分
clf.best_params_ #最佳的一组参数
clf.refit_time_ #在整个数据集上使用最优参数训练模型所花的时间

交叉验证(sklearn.model_selection.cross_val_score)

可以返回值为每一次交叉验证后得分的数组,每一次只能针对一组参数值进行训练,所以如果要确定最优的参数,得自己写一个循环,比较麻烦,得到最优参数之后还要重新在所有数据上自己训练一遍……

cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=’2*n_jobs’, error_score=’raise-deprecating’)
X 需要训练的数据
y=None 数据的标签值
groups=None 划分数据为 train/test set 时使用的分类标签
(其余同上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
import numpy as np

C_list = [1, 10, 100]
cv_scores = []
for c_value in C_list:
model = SVC(C=c_value)
score = cross_val_score(model, X_train, y_train, scoring='roc_auc', cv=10, verbose=1, n_jobs=4)
#score是一个数组哦哦哦
cv_score = np.means(score)
cv_scores.append(cv_score)

best_c = C_list[cv_scores.index(max(cv_scores))]
......

验证曲线(sklearn.model_selection.validation_curve)

这个函数嘞,会返回两个数组:train_scores、test_scores ,比较方便用来画针对某一个参数的学习曲线。两个分别是在进行交叉验证时在训练集s以及验证集上的得分,大小为 (传入的参数数量,交叉验证折数)

validation_curve(estimator, X, y, param_name, param_range, groups=None, cv=’warn’, scoring=None, n_jobs=None, pre_dispatch=’all’, verbose=0, error_score=’raise-deprecating’)
param_name 变化的参数的名称
param_range array-like,用于训练的参数值,对应参数名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection import validation_curve
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt

param_range = list(range(1:9))
train_score, test_score = validation_curve(DecisionTreeClassifier(), X_train, y_train, param_name='max_depth',
param_range=param_range, cv=10, scoring='roc_auc')
train_score = np.mean(train_score, axis=1)
test_score = np.mean(test_score, axis=1)
plt.plot(param_range, train_score, 'o-',color='r', label='training')
plt.plot(param_range, test_score, 'o-',color='g', label='testing')
plt.legend(loc='best')
plt.xlabel('depth')
plt.ylabel('AUC measurement')
plt.show()