山东大学机器学习实验8

本次实验分为几个小章节,第一个章节为超参数的选择以及最佳的选取:

在sklearn中自带网格搜索-----Grid Search,根据这个提前设置好参数范围,就可以快速用不同的参数训练模型,并且找到效果最好的模型所对应的参数。

比如在KNN算法中:

param_grid = [

{

'weights': ['uniform'],

'n_neighbors': [i for i in range(1, 11)]

},

{

'weights': ['distance'],

'n_neighbors': [i for i in range(1, 11)],

'p': [i for i in range(1, 6)]

}

]

knn_clf = KNeighborsClassifier()

grid_search = GridSearchCV(knn_clf, param_grid)

grid_search.fit(X_train, y_train)

grid_search.best_estimator_

grid_search.best_score_

grid_search.best_params_

knn_clf = grid_search.best_estimator_

我们在param_grid中提前设置需要调整的参数,比如用于kneighbors查询的默认邻居的数量:n_neighbors从1到10,和用于Minkowski metric(闵可夫斯基空间)的超参数p ,使用的是闵可夫斯基空间从1到5.然后运行网格搜索就可以从设定的参数范围找到最好的模型并返回对应的参数,对于超参数的选择非常方便。

第二个小章节是数据归一化处理:下面为运用sklearn中的StandardScaler进行测试数据和验证数据归一化处理,然后进行模型训练,最后验证的时候会得到较好的效果。

standardScaler = StandardScaler()

standardScaler.fit(X_train)

standardScaler.mean_

standardScaler.scale_

X_train = standardScaler.transform(X_train)

数据归一化

下面的图形是由随机生成的一组数据进行最值归一化 Normalization处理,全都映射到0到1的区间上之后,画出散点图。

最值归一化 Normalization公式如下:

(X - min(X))/(max(X) - min(X))

下面的图形则是由相同的随机生成数据进行均值方差归一Standarduzation处理,并绘制散点图,发现其映射到-2到2之间。

均值方差归一Standarduzation公式如下:

X= (X - mean(X)) / std(X)

下面的图中数据是由原始数据在sklearn中的StandardScaler下进行归一化处理后的的结果。

下图是原始数据:

而且用经过归一化处理后的数据进行模型训练,最后用同样归一化处理过的测试集进行验证,发现结果出奇的好,所以对数据进行合适的预处理,比如归一化,就会得到较好的模型训练

SVM:

下图是我们从sklearn中的鸢尾花数据集中抽取两种类别出来,并且特征属性也只考虑两种,然后画出散点图,可以明显的发现两大类之间有较为明显的分界线:

下面则是根据sklearn中LinearSVC来对模型进行训练得到的边界。其中惩罚参数是1e9,用来平衡分类间隔和错分样本的,可以发现这个分类边界较好,各类到边界线的最近的点都还有一段距离,抗干扰性强:

图是根据在惩罚参数为1e9的基础上画出了支持向量所在的直线,该直线与边界平行,可以看到间隔比较好,符合预想效果。

下面则是根据sklearn中LinearSVC来对模型进行训练得到的边界。其中惩罚参数是0.01,用来平衡分类间隔和错分样本的,可以发现这个分类边不太好,红类到边界线的最近的点基本没有距离,蓝类甚至都分类错误,抗干扰性不强:

下图是根据在惩罚参数为0.01的基础上画出了支持向量所在的直线,该直线与边界平行,可以明显看出该模型的严重缺陷,支持向量是错误的,并不是离边界最近的点。

1..Grid Search

网格搜索,在所有候选的参数选择中,通过循环遍历,对每一种可能的参数在训练集上训练一个模型,在测试集上表现最好的参数就是最优的参数。

模型最终的表现好坏与初始数据训练集和测试集的划分有很大的关系(测试集数据没有被训练,可能有偏差)。

Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。

.GridSearchCV

grid search with cross validation,将网格搜索与交叉验证结合,交叉验证将数据集划分为训练集、验证集和测试集,其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏,对循环遍历的每个可能的参数,采用交叉验证的方式评价参数质量。

  1. 对于SVC 的惩罚系数,用来平衡分类间隔和错分样本的C:默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。

  1.  scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC 3个类。另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 3个类。相关的类都包裹在sklearn.svm模块之中。

 对于SVC, NuSVC,和LinearSVC 3个分类的类,SVC和 NuSVC差不多,区别仅仅在于对损失的度量方式不同,而LinearSVC是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。

  同样的,对于SVR, NuSVR,和LinearSVR 3个回归的类, SVR和NuSVR差不多,区别也仅仅在于对损失的度量方式不同。LinearSVR是线性回归,只能使用线性核函数。

    我们使用这些类的时候,如果有经验知道数据是线性可以拟合的,那么使用LinearSVC去分类 或者LinearSVR去回归,它们不需要我们去慢慢的调参去选择各种核函数以及对应参数, 速度也快。如果我们对数据分布没有什么经验,一般使用SVC去分类或者SVR去回归,这就需要我们选择核函数以及对核函数调参了。

猜你喜欢

转载自blog.csdn.net/qq_50213874/article/details/129555034