Machine Learning——模型的选择与调优
一、如何选择合适的算法模型
在解决问题的时候,必须考虑下面两个问题:一、使用机器学习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;二、需要分析或者收集的数据是什么。
首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法,确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,如是/否、1/2/3,A/B/C/或者红/黑/黄等,则可以选择分类算法;如果目标变量是连续的数值,如0.0~100.0、-999~999等,则需要选择回归算法。
如果不想预测目标变量的值,则可以选择无监督算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法。
当然在大多数情况下,上面给出的选择办法都能帮助读者选择恰当的机器学习算法,但这也并非一成不变。也有分类算法可以用于回归。
其次考虑的是数据问题,我们应该充分了解数据,对实际数据了解的越充分,越容易创建符合实际需求的应用程序,主要应该了解数据的以下特性:
(1)特征值是 离散型变量 还是 连续型变量 ,(2)特征值中是否存在缺失的值,(3)何种原因造成缺失值,(4)数据中是否存在异常值,(5)某个特征发生的频率如何,等等。充分了解上面提到的这些数据特性可以缩短选择机器学习算法的时间。
二、交叉验证
目的:为了让被评估的模型更加准确可信
1、交叉验证过程
操作:将所有的数据分成n等份,将拿到的数据,分为训练和验证集。
以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。
(1)具体过程(以4折交叉验证为例)
做法:对多次得到的准确率取平均值(模型)
三、网格搜索(超参数搜索)
通常情况下,有很多参数是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
作用:用来调整超参数,比如K-近邻:超参数K
- 注:一般情况下,最常用的是10折交叉验证
注:出现多个超参数时,一般就是做法就是:组合,比如两个K值时,一般都是两个超参数可选值两两结合
1、操作API
超参数搜索-网格搜索API:sklearn.model_selection.GridSearchCV
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)---->对估计器的指定参数值进行详尽搜索
作用:组合(包装)验证,相当于——>
#fit、predict、score knn.fit(x_train, y_train) #得出预测结果 y_predict = knn.predict(x_test) print("预测的目标签到位置为:", y_predict) #得出准确率 print("预测的准确率:", knn.score(x_test, y_test))
参数介绍:
- estimator:估计器对象
- param_grid:估计器参数(dict)----{“n_neighbors”:[1,3,5]}
- cv:指定几折交叉验证
- fit:输入训练数据
- score:准确率
结果分析:
- best_score:在交叉验证中测试的最好结果
- best_estimator:最好的参数模型
- cv_results_:每次交叉验证后的验证集准确率结果和训练集准确率结果
2、鸢尾花案例操作
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split,GridSearchCV
def knn():
iris = load_iris()
x = iris.data #鸢尾花特征值
y = iris.target # 鸢尾花目标值
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.25)
# 进行算法流程
knn = KNeighborsClassifier()
# 构造一些参数的值进行搜素(超参数)
param = {"n_neighbors":[3,5,10]}
# 进行网格搜索
gc = GridSearchCV(knn,param,cv=5)
gc.fit(x_train,y_train)
#预测准确率
print("在测试集上准确率为:",gc.score(x_test,y_test))
print("在交叉验证中测试的最好结果:",gc.best_score_)
print("最好的参数模型:",gc.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:")
print(gc.cv_results_)
if __name__ == '__main__':
knn()