在机器学习的初始阶段,大多数人可能都遇到过处理分类(字符串)变量时的错误。在sklearn中,需要将这些类别转换为数值格式。为了进行这种转换,使用了一些预处理方法,如“标签编码”、“独热编码”等。本文将讨论由Yandex开发并贡献的一个最近开源的库——CatBoost。CatBoost可以直接使用分类特征,并且具有可扩展性。
CatBoost是Yandex最近开源的机器学习算法。它可以轻松集成到Google的TensorFlow和Apple的Core ML等深度学习框架中。它能够处理多种数据类型,帮助解决当今企业面临的广泛问题。最重要的是,它提供了一流的准确性。
CatBoost特别强大的两个方面是:它在不需要其他机器学习方法通常所需的大量数据训练的情况下就能产生最先进的结果,并且为伴随许多业务问题的更具描述性的数据格式提供了强大的开箱即用支持。
“CatBoost”这个名字来源于两个词“Category”和“Boosting”。正如讨论的那样,该库能够很好地处理多种类别的数据,如音频、文本、图像,包括历史数据。“Boost”来自梯度提升机器学习算法,因为该库基于梯度提升库。梯度提升是一种强大的机器学习算法,广泛应用于多种业务挑战,如欺诈检测、推荐项目、预测等,并且表现良好。它也可以在相对较少的数据下返回非常好的结果,与需要从大量数据中学习的深度学习模型不同。
性能:CatBoost提供了最先进的结果,并且在性能方面与任何领先的机器学习算法竞争。
自动处理分类特征:可以使用CatBoost而无需任何显式的预处理将类别转换为数字。CatBoost使用各种统计数据将分类值转换为数字,这些统计数据涉及分类特征的组合以及分类和数值特征的组合。
鲁棒性:它减少了对广泛的超参数调整的需求,并降低了过拟合的可能性,从而得到更泛化的模型。尽管如此,CatBoost有多个参数可以调整,包括树的数量、学习率、正则化、树深度、折叠大小、装袋温度等。
易用性:可以从命令行使用CatBoost,也可以使用Python和R的用户友好API。
有多个提升库,如XGBoost、H2O和LightGBM,所有这些库在各种问题上都表现良好。CatBoost开发者已经在标准ML数据集上与竞争对手的性能进行了比较:上述比较显示了测试数据的log-loss值,在大多数情况下,CatBoost的值是最低的。这清楚地表明CatBoost在调整和默认模型中大多表现更好。
此外,CatBoost不需要将数据集转换为任何特定格式,如XGBoost和LightGBM。
# Python安装
pip install catboost
# R安装
install.packages('devtools')
devtools::install_github('catboost/catboost', subdir = 'catboost/R-package')
# 导入所需库
import pandas as pd
import numpy as np
from catboost import CatBoostClassifier
from sklearn.metrics import accuracy_score
# 读取训练和测试数据集
train_data = pd.read_csv('train-data.csv')
test_data = pd.read_csv('test-data.csv')
# 数据集的形状
print('Shape of training data :',train_data.shape)
print('Shape of testing data :',test_data.shape)
# 现在,使用了一个包含更多分类变量的数据集
# hr-employee attrition数据,其中目标变量是Attrition
# 在训练数据上分离独立和目标变量
train_x = train_data.drop(columns=['Attrition'],axis=1)
train_y = train_data['Attrition']
# 在测试数据上分离独立和目标变量
test_x = test_data.drop(columns=['Attrition'],axis=1)
test_y = test_data['Attrition']
# 找出分类变量的索引
categorical_var = np.where(train_x.dtypes != np.float)[0]
print('\nCategorical Variables indices : ',categorical_var)
print('\n Training CatBoost Model..........')
model = CatBoostClassifier(iterations=50)
# 用训练数据拟合模型
model.fit(train_x,train_y,cat_features = categorical_var,plot=False)
print('\n Model Trainied')
# 在训练数据集上预测目标
predict_train = model.predict(train_x)
print('\nTarget on train data',predict_train)
# 在训练数据集上的准确率得分
accuracy_train = accuracy_score(train_y,predict_train)
print('\naccuracy_score on train dataset : ', accuracy_train)
# 在测试数据集上预测目标
predict_test = model.predict(test_x)
print('\nTarget on test data',predict_test)
# 在测试数据集上的准确率得分
accuracy_test = accuracy_score(test_y,predict_test)
print('\naccuracy_score on test dataset : ', accuracy_test)