模型评估与优化方法

cross-validation

交叉验证法是一种非常常用的对于模型泛化性能进行评估的方法。在sklearn中默认的使用的是K折交叉验证法,即是将数据集拆分为k个部分,然后1个作为testing set,剩下的k-1个作为training set。然后进行k次的模型训练,最后得到k个模型的评分。
下面介绍一下这个函数的一些常用的参数:
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’)
estimator:这个参数主要是用来确定使用哪一个模型进行训练。
X,y:这两个参数就不用说了,就相当于输入和输出。
cv:它可以是一个整数,来指定k值,也可以是一个分割了训练集、数据集的迭代生成器。
n_jobs:使用的cpu核数,建议和自己机器的一致。
下面就介绍一下cv另一种赋值方法:

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.2,train_size=.7,n_splits=10)
scores = cross_val_score(svc,X,y,cv=shuffle_split)
# for i,j in shuffle_split.split(X):
#     print("training set: {}".format(i),"testing set: {}".format(j))
print(scores)

运行结果如下:
在这里插入图片描述
可以清楚的看到10次评分的结果。

网格搜索

在选取模型的参数时,需要多次的手动的改变参数,然后来确定最优的参数。但是这样明显很繁琐,这里有一点小技巧可以简化这个过程,就是网格搜索法。
下面介绍一个类可以实现与交叉验证结合的网格搜索,这个类为scikit-learn中类置,GridSearchCV。下面通过一些代码来演示其用法:

from sklearn.model_selection import GridSearchCV
params = {'alpha':alphas,'max_iter':max_iters}
grid_search = GridSearchCV(lasso,params,cv=6)
grid_search.fit(X_train,y_train)
print("模型得分:{:.3f}".format(grid_search.score(X_test,y_test)))
print("最优参数:{}".format(grid_search.best_params_))
print("交叉验证最高分:{:.3f}".format(grid_search.best_score_))

运行结果如下:
在这里插入图片描述
可以看到使用这个方法,可以很好的达到调节参数的目的。

分类可信度评估

在分类过程中,分类算法会确定某个数据点属于某类的概率,若这个数据点属于另外一个类的概率大于其他的,那么久将其分为这个类。
下面我们来介绍一下查看分类可信度的方法。
第一种是predict_proba,在很多分类模型中都有这个功能。下面用实例说明:

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
import numpy as np
X,y = make_blobs(n_samples=200,random_state=1,centers=2,cluster_std=5)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=30)
gnb = GaussianNB()
gnb.fit(X_train,y_train)
#获得高斯贝叶斯分类准确率
predict_proba = gnb.predict_proba(X_test)
print("预测准确率形态:{}".format(predict_proba.shape))
print(predict_proba[:5])

运行结果如下:
模型评估与优化方法_第1张图片
可以看到其五个数据,每一行中的第一个为第一类的概率,第二个为第二类的概率。
但是并不是每个分类算法都有predict_proba属性,所以这里又引入了第二个方法decision_function。同样用例子来说明。

from sklearn.svm import SVC
svc = SVC().fit(X_train,y_train)
dec_func = svc.decision_function(X_test)
print(dec_func.shape)
print(dec_func[:5])

运行结果如下:
在这里插入图片描述
可以看到对于二元分类任务,它只返回一个值,若是正数则为1类,是负数则为2类。对于多元分类任务一样适用。

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