文章目录
- 前言
- 一、导入库与数据
- 二、数据集切分与特征缩放
- 三、数据训练与预测
-
- 3.1 安装CatBoost
- 3.2 训练CatBoost
-
- 3.2.1 不加Categorical features选项:
- 3.2.2 加Categorical features选项:
- 3.3 预测测试集结果
-
- 保姆级解说:
- 3.4 模型评估
- 总结
前言
之前介绍了Xgboost、LightGBM,这一步介绍的是第三个基于GBDT改进的算法,CatBoost,全称大概是这个Gradient Boosting(梯度提升) + Categorical Features(类别型特征)。
那么,它有啥独特之处呢?
(1)从名字来看,“Categorical Features(类别型特征)”,所以它对分类型特征有自己独到的处理方法。省得我们我们在筛选变量的时候纠结于连续变量和分类变量的相关性。
(2)预测偏移处理,从而减少模型的过拟合。
(3)运算速度快,至少比Xgboost快得多。
具体怎么改良的,也不细说了,有兴趣的可以自行食用,网址:https://catboost.ai/。
我们直接上代码实战,继续SUV的例子:
一、导入库与数据
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 导入数据集
dataset = pd.read_csv('Day 4 Social_Network_Ads.csv')
X = dataset.iloc[:, [1, 2, 3]].values
Y = dataset.iloc[:, 4].values
# 性别转化为数字
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
二、数据集切分与特征缩放
# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, Y, test_size=0.25, random_state=0)
# 特征缩放
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
三、数据训练与预测
3.1 安装CatBoost
Sklearn并没有包含CatBoost,所以得自己安装,步骤如下:
① 使用pip进行安装。打开Anaconda Prompt。这个都会吧,点击“开始”,找到Anaconda (64-bit)文件夹,子菜单就有了。
② 输入pip install catboost,回车。开始下载。
③ 网速太慢了(校园网一言难尽),然后就悲剧了,洗洗睡吧。
④ 然后试一试,清华大学的镜像网址,输入:pip install catboost -i https://pypi.tuna.tsinghua.edu.cn/simple。嗯,快到飞起!安装成功。
⑤ 打开Spyder,输入import catboost,回车。无报错,安装成功。
温馨提示:网速慢的时候,装包有两种方法:一是用清华镜像,输入pip install 包的名称 -i https://pypi.tuna.tsinghua.edu.cn/simple;二是自己去下载安装包,手动安装,教程见Xgboost的安装(具体下载网址百度它的官网就好)。
3.2 训练CatBoost
import catboost as cb
3.2.1 不加Categorical features选项:
Clf1 = cb.CatBoostClassifier(eval_metric='AUC', depth=10, iterations= 500, l2_leaf_reg= 9, learning_rate= 0.15)
Clf1.fit(X_train, y_train)
3.2.2 加Categorical features选项:
Clf2 = cb.CatBoostClassifier(eval_metric='AUC', depth=10, iterations= 500, l2_leaf_reg= 9, learning_rate= 0.15)
cat_features_index = [0] #性别在第0列
Clf2.fit(X_train, y_train, cat_features=cat_features_index )
3.3 预测测试集结果
y_pred1 = Clf1.predict(X_test)
y_pred2 = Clf1.predict(X_test)
保姆级解说:
CarBoost的参数同样让人绝望,可以分为五类:公共参数、category参数、output 参数、过拟合检测设置和数值型变量分箱设置参数。
下面只介绍重要参数
(具体可以看:https://catboost.ai/en/docs/references/training-parameters/):
1.1、公共参数
① loss_function:指损失函数,默认Logloss。可选项:RMSE, Logloss, MAE, CrossEntropy, Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE, Poisson。
② custom_loss:指定训练过程中计算显示的损失函数。可选项:Logloss、CrossEntropy、Precision、Recall、F、F1、BalancedAccuracy、AUC等。
③ eval_metric:指定用于过度拟合检测和最佳模型选择的指标。可选项同custom_loss。
④ iterations:迭代次数,默认500。
⑤ learning_rate:学习速度,默认0.03。
⑥ random_seed:随机种子。
⑦ l2_leaf_reg:L2正则化。
⑧ bootstrap_type:确定抽样时的样本权重,默认GPU下为Bayesian、CPU下为MVS。可选项:Bayesian、Bernoulli(伯努利实验)、MVS(仅支持cpu)、Poisson(仅支持gpu)、No(取值为No时,每棵树为简单随机抽样)。
⑨ bagging_temperature:bootstrap_type=Bayesian时使用,取值为1时采样权重服从指数分布;取值为0时所有采样权重均等于1。取值范围[0,inf),值越大、bagging就越激进。
⑩ subsample:样本采样比率(行采样)。
⑪ sampling_frequency:采样频率,仅支持CPU。可选:PerTree(在构建每棵新树之前采样)、PerTreeLevel(默认值,在子树的每次分裂之前采样)。
⑫ random_strength:特征分裂信息增益的扰动项,默认1,用于避免过拟合。
⑬ use_best_model:使用效果最优的子树棵树/迭代次数,使用验证集的最优效果对应的迭代次数(eval_metric:评估指标,eval_set:验证集数据)。
⑭ best_model_min_trees:最少子树棵树。和use_best_model一起使用。
⑮ depth:树深度,默认6。
⑯ grow_policy:子树生长策略。可选:SymmetricTree(默认值,对称树)、Depthwise(整层生长,同xgb)、Lossguide(叶子结点生长,同lgb)。
⑰ min_data_in_leaf:叶子结点最小样本量。
⑱ max_leaves:最大叶子结点数量。
⑲ rsm:列采样比率,默认值1,取值(0,1]。
⑳ nan_mode:缺失值处理方法。可选:Forbidden(不支持缺失值,输入包含缺失时会报错)、Min(处理为该列的最小值,比原最小值更小)、Max(处理为该列的最大值,比原最大值更大)。
input_borders:特征数据边界(最大最小边界),会影响缺失值的处理(nan_mode取值Min、Max时),默认值None。
class_weights:y标签类别权重。用于类别不均衡处理,默认均为1。
auto_class_weights:自动计算平衡各类别权重。
scale_pos_weight:二分类中第1类的权重,默认值1(不可与class_weights、auto_class_weights同时设置)。
boosting_type:特征排序提升类型。可选项:Ordered(catboost特有的排序提升,在小数据集上效果可能更好,但是运行速度较慢)、Plain(经典提升)
feature_weights:特征权重,在子树分裂时计算各特征的信息增益该特征权重。设置方式:1)feature_weights = [0.1, 1, 3];2)feature_weights = {“Feature2”:1.1,“Feature4”:0.3}。
1.2、category参数
① max_ctr_complexity:指定分类特征交叉的最高阶数,默认值4。
1.3、ouput参数
① logging_level:选择输出什么信息,可选项:Silent(不输出信息)、Verbose(默认值,输出评估指标、已训练时间、剩余时间等)、Info(输出额外信息、树的棵树)、Debug(debug信息)。
② metric_period:指定计算目标值、评估指标的频率,默认值1。
③ verbose:输出日记信息,类似于logging_level(两者只设置一个),取值True对应上方Verbose、False对应Silent。
1.4、过拟合检测参数
① early_stopping_rounds:早停设置,默认不启用。
② od_type:过拟合检测类型,默认IncToDec。可选:IncToDec、Iter。
③ od_pval:IncToDec过拟合检测的阈值,当达到指定值时,训练将停止。要求输入验证数据集,建议取值范围[10e-10,10e-2s]。默认值0,即不使用过拟合检测。
1.5、数值型变量分箱设置参数
① border_count:分箱数,默认254。
② feature_border_type:分箱方法,默认GreedyLogSum。可选:Median、Uniform、UniformAndQuantiles、MaxLogSum、MinEntropy、GreedyLogSum。
2、CatBoost的参数更加凶残。因此调参也是一门大工程。这里我就随缘设置几个参数,先看看效果。
3、CatBoost的拟合部分代码有些不同,分为“不加Categorical features选项”和“不加Categorical features选项”。其中不加的话,fit函数跟之前的一致:Clf1.fit(X_train, y_train),没啥好说的。主要是,加的话,得告诉模型你的分类变量有多少种类,分别用什么数值表示。比如SUV这个数据集,性别是分类变量,有“男”、“女”两类,用数值0和1代替,在第0列,所以代码为:cat_features_index = [0]。拟合函数代码:Clf2.fit(X_train, y_train, cat_features=cat_features_index )。然后就悲剧了,直接报错:
遇到报错不要紧张,看提示,找出原因:
CatBoostError: ‘data’ is numpy array of floating point numerical type, it means no categorical features, but ‘cat_features’ parameter specifies nonzero number of categorical features
翻译成人话:
你不是说第0列是分类变量么,分类变量怎么是浮点型数值,不应该是0,1,2,3这种整数型么?
然后我们看看X_train,长啥样:
看到了吧,已经不是0和1了,因为被归一化了,归一化前长这样: 所以我们应该用的数据集是第0列不归一化,其余归一化,我偷懒,就不搞归一化了,直接干:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import LabelEncoder
dataset = pd.read_csv('Day 4 Social_Network_Ads.csv')
X = dataset.iloc[:, [1, 2, 3]].values
y = dataset.iloc[:, 4].values
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
import catboost as cb
Clf2 = cb.CatBoostClassifier(eval_metric='AUC', depth=10, iterations= 500, l2_leaf_reg= 9, learning_rate= 0.15)
cat_features_index = [0] #性别在第0列
Clf2.fit(X_train, y_train, cat_features=cat_features_index )
y_pred2 = Clf2.predict(X_test)
3.4 模型评估
模型预测,使用混淆矩阵评估:
from sklearn.metrics import confusion_matrix
cm1 = confusion_matrix(y_test, y_pred1)
print('不加Categorical features选项')
print(cm1)
cm2 = confusion_matrix(y_test, y_pred2)
print('加Categorical features选项')
print(cm2)
看看最终输出的结果
总结
似乎也没啥差别,是否归一化,是否制定分类变量。跟数据集有关吧。
今天就不可视化了。
今天第一次演示了代码出现bug怎么处理,这种现象非常常见,首先要放轻松,看看报错信息是什么,复制报错信息到CSDN论坛,一般都有相同的情况,然后根据网友的解决方式,慢慢排除。
所以啊,ML的门槛就在这里啦,排除BUG,底层逻辑还是要对算法有一定理解。