机器学习,如何使用xgboost预测泰坦尼克数据集结果?
发布于 作者:苏南大叔 来源:程序如此灵动~对这个泰坦尼克数据集已经反复分析了好多次了,在本文中就根据这个数据集的其中一个版本,做个xgboost
的预测。其实,用什么模型来预测,都会有数据结果。不同的就是:预测的精准度的问题。可谓是条条大路通罗马,款款预测有结果。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
,xlrd@2.0.1
,openpyxl@3.1.2
,scikit-learn@1.5.0
,xgboost@2.0.3
。
前置文章
本文的正确理解,建立在对泰坦尼克数据集字段的正确理解上。所以,参考文章:
应该知道:网络上的泰坦尼克数据集有很多个版本,每个版本的字段写法都不一样。具体的数据情况,也不一样。所以,加载使用这些数据集的方式方法也不一样。
拿到数据之后,要根据每个数据集的具体情况和目标需求,对数据集进行一定的加工处理。参考文章:
苏南大叔使用xgboost
对鸢尾花数据集进行预测的文章,可以参考:
数据初步处理
本文使用的泰塔尼克数据集来自斯坦福大学的公开版本,加载地址是:
这个斯坦福的数据集版本,字段比较少,并且没有空值,没有重复值。
import pandas as pd
df = pd.read_csv("titanic.csv")
print(df.count())
输出:
Survived 887
Pclass 887
Name 887
Sex 887
Age 887
Siblings/Spouses Aboard 887
Parents/Children Aboard 887
Fare 887
dtype: int64
关于数据处理的部分,每个人都有自己的不同理解。参考代码:
df = df.drop_duplicates()
df = df.drop('Name', axis=1)
df = pd.get_dummies(df, columns=['Pclass', 'Sex'], drop_first=True)
print(df.count())
输出:
Survived 887
Age 887
Siblings/Spouses Aboard 887
Parents/Children Aboard 887
Fare 887
Pclass_2 887
Pclass_3 887
Sex_male 887
dtype: int64
数据分割
【首要目标】就是:分割目标字段和特性字段。目标字段当然是Survived
了,所以分割代码为:
target = df['Survived']
features = df.drop('Survived', axis=1)
这里的.drop
方法,可以参考:
【其次目标】就是:分割训练集和测试集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_true = train_test_split(features, target, test_size=0.25, random_state=42)
关于这个数据集分割的方法,可以参考:
模型预测
模型预测的代码很少,重复度也很高。每个模型大体上来说,就是换换模型的名称。
import xgboost as xgb
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
预测的准确率
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
s = accuracy_score(y_true, y_pred)
print("准确度 : ", s)
关于准确度和查准率的区分,可以参考:
F1评分
更加权威的模型评价方法是classification_report()
。
from sklearn.metrics import classification_report
n = classification_report(y_true, y_pred)
print(n)
输出:
precision recall f1-score support
0 0.85 0.85 0.85 140
1 0.74 0.74 0.74 82
accuracy 0.81 222
macro avg 0.80 0.80 0.80 222
weighted avg 0.81 0.81 0.81 222
目标值阴性的数据条数为140,目标值阳性的数据条数为82。f1
得分越高,表示这个模型越精准。所以,这个xgboost
模型,对于当前数据集来说,效果还算不错。
参考文章:
- https://newsn.net/say/sklearn-classification_report.html
- https://newsn.net/say/sklearn-score-average.html
字段重要性排序
feat_importances = pd.Series(model.feature_importances_, index=features.columns)
print(feat_importances.sort_values(ascending=False))
输出:
Sex_male 0.532251
Pclass_3 0.306623
Siblings/Spouses Aboard 0.056289
Parents/Children Aboard 0.030514
Fare 0.028949
Age 0.028162
Pclass_2 0.017212
dtype: float32
这个结果表示的是:性别sex
以及票等级pclass
这两个字段比较重要。不过这个结论有待论证。
结束语
如果对于模型预测的结果不满意,可以调整训练集的样本。更多机器学习的文章,可以参考苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。