一、案例介绍
本案例对葡萄酒类进行分类,使用XGBoost模型实现,该数据来源:酒类。
数据集信息:
这些数据是对意大利同一地区种植但来自三种不同品种的葡萄酒进行化学分析的结果。该分析确定了三种葡萄酒中每一种的 13 种成分的含量。
一共13种属性:
- 酒精
- 苹果酸
- 灰分
- 灰分的碱度
- 镁
- 总酚
- 类黄酮
- 非黄酮酚类
- 原花青素
- 颜色强度
- 色调
- 稀释葡萄酒的 OD280/OD315
- 脯氨酸
数据也可以通过我的百度网盘下载:
链接:https://pan.baidu.com/s/1dLlZgyG18CL3QN3tTRegEA?pwd=t0bo
提取码:t0bo
把文件后缀改为csv,如下:
手动拉一下数据,把第一列的类标签1,2,3全部改成0,1,2:
二、导入模块与数据
导入模块:
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
读取数据:
df=pd.read_csv('wine.csv')
# 原来的数据没有列名字,添加列名字
df.columns=['class','alcohol','malic_acid','ash','alcalinity_of_ash','magnesium','total_phenols','flavanoids','nonflavanoid_phenols','proanthocyanins','color_intensity','hue','od280/od315_of_diluted_wines','proline']
df.head()
运行如下:(值得说明的是,class是类的标签,总共有1,2,3三个标签)
查看数据基本信息:
df.describe()
运行如下:
三、拆分为训练和测试数据集
我们以百分之30作为测试集,另外 70% 用于训练。该random_state参数采用任何整数值,这意味着我们每次运行模型时都会获得可重现的结果。
拆分之后,我们的训练数据存储在 中X_train,y_train我们的测试数据存储在X_test和中y_test。顾名思义,它将X_train用于训练模型的数据。数据在X_test训练期间不使用(或“保留”),而是在训练后用于评估模型并使用一些特殊的性能评估指标评估其准确性。
x=df.drop(columns='class')
y=df['class']
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
四、模型
现在数据已经准备好了,我们可以定义XGBClassifier模型的配置。你可以将大量选项传递给模型,这些选项可以进行调整或“调整”以帮助生成更准确的结果 - 这一过程称为超参数调整。
现在,我们将拟合一个所谓的“基本模型”,它几乎没有任何配置选项。这将使我们能够直接看到开箱即用的性能。定义模型参数后,我们将输出分配给一个名为 的对象model。
model = XGBClassifier(use_label_encoder=False, eval_metric='mlogloss')
接下来,我们将使用我们的对象的fit()功能model在我们的训练数据上训练模型。该模型被随机选择了我们上面加载的整个数据集的 70% 部分,其中X和y数据是分开的。当fit()函数运行时,XGBoost 算法将检查数据并寻找特征和目标变量之间的相关性。它将一遍又一遍地重新运行训练过程,直到它在做出预测时变得更加准确。
model.fit(X_train, y_train)
运行输出如下:
XGBClassifier(base_score=0.5, booster='gbtree', callbacks=None,
colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1,
early_stopping_rounds=None, enable_categorical=False,
eval_metric='mlogloss', gamma=0, gpu_id=-1,
grow_policy='depthwise', importance_type=None,
interaction_constraints='', learning_rate=0.300000012,
max_bin=256, max_cat_to_onehot=4, max_delta_step=0, max_depth=6,
max_leaves=0, min_child_weight=1, missing=nan,
monotone_constraints='()', n_estimators=100, n_jobs=0,
num_parallel_tree=1, objective='multi:softprob', predictor='auto',
random_state=0, reg_alpha=0, ...)
五、绘制特征的重要性排名(拓展)
只需要导入两行代码即可:
from jcopml.feature_importance import mean_score_decrease
df_imp = mean_score_decrease(X_train, y_train, model, plot=True)
运行如下:
五、预测
最后,我们可以使用在训练数据上训练的模型来使用该predict()函数对测试或验证数据集进行预测。这仅需要X数据。我们没有提供(或“保留”)y包含答案的数据,因为我们想评估我们的模型对以前未见过的数据的预测效果如何。
y_pred = model.predict(X_test)
运行输出如下:(可以看到是得到了类)
array([1, 1, 0, 1, 0, 2, 1, 0, 1, 1, 0, 0, 1, 2, 1, 1, 2, 0, 1, 0, 0, 1,
2, 1, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 0, 1, 1, 0,
0, 0, 1, 0, 0, 1, 1, 1, 2, 0], dtype=int64)
六、性能评估
为了评估我们的模型在预测它以前没有见过的葡萄酒类别方面的性能,我们可以使用该accuracy_score()函数。y_test这需要两个值:包含实际结果的原始数据和y_pred包含预测结果的预测数组。
模型的准确度分数是通过将正确预测的数量除以总预测的数量来计算的:
from sklearn import metrics
print("准确率:",metrics.accuracy_score(y_test, y_pred))
结果为:98,很高了。要把这样的步骤当作模板使用。下一篇讲解模型的保存于加载。