04【基础课一机器学习项目】第二周第二节:算法选型

内容简介

任务简介:了解数据的来源、数据的内容,学会查看数据等等数据的指标。
详细说明:
针对于特定得场景的数据做出一些效果来,然后再就是提升在提升。从各个角度去对比几种算法的优缺点,最终选择一个或者多个模型的堆叠或者融合。
1、算法选型(svm、ensemable、lightgbm、catboost),先从简单的模型开始讲起,再回过头去处理和重新选择算法。最终选取catboost和lightgbm作比较。
2、算法调参(sklearn grid_search_cv)
3、算法比较(时间,精度比较)
4、准确率比较、损失、计算速度比较
其它调参工具介绍:https://blog.csdn.net/fengchi863/article/details/80512715

算法选型概述

在完成数据的预处理的基础上就进入这个环节。
1、明白这是做什么的?(分类还是回归?)这个题目属于预测,这里先按分类来做演示讲解。当然还有类似生成式的任务等等
2、选择什么模型?(当然是又小又好)也就是准确率又高,模型又不是很复杂。尤其类似这种要部署到工业环境上的,弄个DNN的算法估计难得跑起来,而且有时候还需要有实时性的要求。
3、调用模型时要方便快捷?(主要涉及到选择的调用库等等!)
刚开始先要划分验证集validate set。具体理论可以看这里逻辑斯蒂回归
主要函数:
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。
官网实例:https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation

格式:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)

参数解释:
train_data:被划分的样本特征集
train_target:被划分的样本标签
test_size:如果是浮点数,在0-1之间,表示样本占比,比如test_size=0.2;如果是整数的话就是样本的数量
random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

## 导入数据划分函数
from sklearn.model_selection import train_test_split
## train是上节数据预处理后筛选得到的14个特征,相当于X;train_data['Quality_label']是数字化后的标签,相当于Y
## 这里切分训练集和验证集的比例是用的默认值,当然可以自己设置。
X_train, X_test, y_train, y_test = train_test_split(train, train_data['Quality_label'])

第一个算法: SVM

SVC是SVM做分类的模块,这个算法秒train,效果从评分来看不怎么样,所以没有花精力去调整参数,仅仅用来做对比。

from sklearn.svm import SVC#导入算法

model = SVC()#实例化算法
model.score(X_test,y_test)##模型的评分
##这里是结果
SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
##结束
model.score(X_test,y_test)##模型的评分最后结果是0.74

第二个算法:集成算法(ensemble)【GBDT、RF、Boosting等】

from sklearn.ensemble import GradientBoostingClassifier#导入梯度提升分类器
from sklearn.model_selection import GridSearchCV#算法调参工具
model1 = GradientBoostingClassifier()#实例化算法
model2 = GridSearchCV(model1,param_grid={"learning_rate":[0.1,0.01,0.001],"n_estimators":[10,100,1000]},verbose=2)
model2.fit(X_train,y_train)

ensemble算法一般效果不错,重点调教一下,调教用的包是GridSearchCV。
把光标放到GradientBoostingClassifier()的括号里面,然后按shift+tab键,可以弹出该函数的参数说明,如下图所示。
在这里插入图片描述
然后在GridSearchCV中调教两个参数(实际上是要调很多个参数的。):学习率learning_rate和集合模型的个数n_estimators,这里还要注意,这里的两组参数的备选个数要一样,这里都是3个。。这里的param_grid就是放到各种要调教的参数,来自于GradientBoostingClassifier,就是上面的图里面的东西。
如果要看调教的过程,可以写verbose=2。
整个交叉验证加上两组参数的组合一共有45种组合:
Fitting 5 folds for each of 9 candidates, totalling 45 fits。

model2.best_params_ ##找到最好的参数{'learning_rate': 0.1, 'n_estimators': 100}
model2.score(X_test,y_test)#输出准确率,这里是0.9946666666666667,但是这里做的是分类准确率,并不是预测准确率。
model1.fit(X_train,y_train)## GBDT模型的训练

第三个算法:lightgbm

这个算法不在sklearn里面,要自己安装:
pip install lightgbm

from lightgbm import LGBMClassifier##导入算法
model3 = LGBMClassifier(verbose=2)##实例化算法
model3.fit(X_train,y_train,eval_set=[(X_test,y_test)])##算法训练(加上交叉验证集)
model3.score(X_test,y_test)#模型评分,0.9886666666666667

第四个模型:catboost

毛子开发的模型,特点是它接收的训练数据可以比较糙,类似字符串什么的都可以往里面丢。安装:
pip install catboost
一样的套路

from catboost import CatBoostClassifier# 导入算法
model4 = CatBoostClassifier()#算法实例化
model4.fit(X_train,y_train,eval_set=[(X_test,y_test)])##模型的训练

模型比较

这里主要比较两个方面,一个是损失函数的收敛速度和准确率。当然还有很多需要考虑,模型复杂度什么的。

比较损失函数的优劣

history_1 = model3.evals_result_#这里把lightgbm训练过程结果保存下来
history_2 = model4.evals_result_#这里把catboost训练过程结果保存下来

#画图:
a = history_1['valid_0']['multi_logloss']

b = history_2['learn']["Logloss"]

plt.plot(np.arange(len(a)), a)
plt.plot(np.arange(len(b)), b)
plt.title('lgb-cat, loss损失图像')
plt.xlabel('迭代次数')
plt.ylabel('损失值')
plt.legend(['LGB','CAT'])
plt.show()

在这里插入图片描述
这里的图形并不太严谨,因为两个算法的迭代次数不同,代表CAT的黄色迭代将近1000次,而蓝色只有不到200次。

准确率比较

%%time
##用来保存准确率的数组变量
a = []
b = []

# 定义模型
for i in range(10):#循环10,重新训练模型保存每次的准确度
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(train, train_data['Quality_label'])
    
    lgb_model = LGBMClassifier()
    cbt_model = CatBoostClassifier(verbose=200)
    
    # 训练模型
    lgb_model.fit(X_train, y_train)
    cbt_model.fit(X_train, y_train)

    a.append(lgb_model.score(X_test, y_test))
    b.append(cbt_model.score(X_test, y_test))
    
print('训练完成')
#最后画图
x = np.arange(10)
plt.plot(x, a)
plt.plot(x, b)

plt.title('模型准确率对比')
plt.xlabel('次数')
plt.ylabel('准确率')
plt.legend(['LGB', 'Cat'])
plt.show()

在这里插入图片描述

发布了172 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/oldmao_2001/article/details/104673790