XGBoost - Python 实现
本章将使用 XGBoost Python 模块在泰坦尼克号数据上训练一个 XGBoost 模型。我们构建此模型的主要目标是通过考虑年龄、性别和等级等变量来预测乘客是否幸存。此外,我们还将修改模型的超参数。
先决条件
在您可以使用 Python 构建 XGBoost 模型之前,必须满足以下条件:
Python 环境: 需要 Python 3.6 或更高版本。您可以使用 PyCharm、Visual Studio Code 或 Jupyter Notebook 等库来编写和运行 Python 代码。
库: 需要安装用于数据处理、可视化和机器学习的 Python 库。我们将在模型中使用的库包括 scikit-learn、xgboost、matplotlib、pandas、numpy 和 seaborn。
数据集: 一个有效的数据集,其中包含用于二元或多类分类的特征和因变量。数据集需要采用 pandas 可以快速加载的格式,例如 CSV。
拥有必要的工具、库、数据集和基本知识将有助于您使用 Python 构建 XGBoost 模型。
XGBoost 实现
以下是您需要遵循的步骤:
步骤 1:安装所需的库
此实现需要一些库,如果您尚未安装,请使用以下命令安装:
# Install necessary libraries pip install matplotlib pip install numpy pip install pandas pip install scikit-learn pip install seaborn pip install xgboost
步骤 2:导入所需的库
现在您需要导入库:
# Here are the imports import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import xgboost as xgb from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay from sklearn.model_selection import GridSearchCV, train_test_split
步骤 3:加载泰坦尼克号数据集
本课程将使用泰坦尼克号数据集,该数据集可以从 Kaggle 和其他网站下载。因此,下载 titanic.csv 获取泰坦尼克号数据集。您需要将 CSV 文件上传到您的 Jupyter Notebook。此时,将数据读取到 pandas DataFrame 中:
# Load the dataset
titanic_df = pd.read_csv('/Python/Datasets/titanic.csv')
# Display the first few rows of the dataset
print(titanic_df.head())
输出
这将产生以下结果:
PassengerId Survived Pclass \
0 1 0 3
1 2 1 1
2 3 1 3
3 4 1 1
4 5 0 3
Name Gender Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
4 Allen, Mr. William Henry male 35.0 0
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
3 0 113803 53.1000 C123 S
4 0 373450 8.0500 NaN S
步骤 4:数据预处理
在训练模型之前,需要对数据进行预处理。此步骤包括处理缺失数据、编码分类变量和选择特征。查找任何缺失的值:
# Check for missing values print(titanic_df.isnull().sum())
输出
这将生成以下结果:
PassengerId 0 Survived 0 Pclass 0 Name 0 Gender 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
填写空白或删除它们:
# Drop rows with missing values titanic_df = titanic_df.dropna()
现在我们将选择必要的特征并编码分类变量
# Select features and target variable
X = titanic_df[['Pclass', 'Gender', 'Age', 'SibSp', 'Parch', 'Fare']]
y = titanic_df['Survived']
# Encode categorical variable 'Gender'
X.loc[:, 'Gender'] = X['Gender'].map({'male': 0, 'female': 1})
步骤 5:训练和评估模型
将数据分成训练集和测试集后,我们将训练模型并评估其有效性。这里将数据分成如下:
# Split data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
接下来,我们需要将数据转换为 XGBoost 模型的 DMatrix 格式:
# Convert 'Gender' column to numeric in both training and test sets
X_train['Gender'] = X_train['Gender'].map({'male': 0, 'female': 1})
X_test['Gender'] = X_test['Gender'].map({'male': 0, 'female': 1})
# Ensure there are no missing values and data types are numeric
X_train = X_train.astype(float)
X_test = X_test.astype(float)
# Now convert to DMatrix format
dmatrix_train = xgb.DMatrix(data=X_train, label=y_train)
dmatrix_test = xgb.DMatrix(data=X_test, label=y_test)
然后我们将训练模型:
# Set learning objective
learning_objective = {'objective': 'binary:logistic'}
# Train the model
model = xgb.train(params=learning_objective, dtrain=dmatrix_train)
之后,我们需要评估模型:
# Make predictions
test_predictions = model.predict(dmatrix_test)
round_test_predictions = [round(p) for p in test_predictions]
# Calculate accuracy
accuracy = accuracy_score(y_test, round_test_predictions)
print(f'Accuracy: {accuracy:.2f}')
输出
这将创建以下结果:
Accuracy: 0.80
步骤 6:超参数调优
我们现在将使用 GridSearchCV 实现超参数调优,以找到 XGBoost 模型的理想参数。因此,设置参数网格:
# Define the parameter grid
params_grid = {
'learning_rate': [0.01, 0.05],
'gamma': [0, 0.01],
'max_depth': [6, 7],
'min_child_weight': [1, 2, 3],
'subsample': [0.6, 0.7],
'n_estimators': [400, 600, 800],
'colsample_bytree': [0.7, 0.8],
}
定义并设置 XGBoost 分类器和 GridSearchCV:
# Define the XGBoost classifier classifier = xgb.XGBClassifier() # Set up GridSearchCV grid_classifier = GridSearchCV(classifier, params_grid, scoring='accuracy', cv=5) grid_classifier.fit(X_train, y_train)
确定最合适的参数后,我们将评估模型
# Get best parameters
best_parameters = grid_classifier.best_params_
print("Best parameters:", best_parameters)
# Make predictions with the best model
grid_test_preds = grid_classifier.predict(X_test)
# Calculate accuracy
grid_test_accuracy = accuracy_score(y_test, grid_test_preds)
print(f'GridSearchCV Accuracy: {grid_test_accuracy:.2f}')
输出
这将导致以下结果:
Best parameters: {'colsample_bytree': 0.7, 'gamma': 0, 'learning_rate': 0.01, 'max_depth': 7, 'min_child_weight': 1, 'n_estimators': 600, 'subsample': 0.7}
GridSearchCV Accuracy: 0.78
在这里,我们将绘制混淆矩阵。
# Plot confusion matrix cm = confusion_matrix(y_test, grid_test_preds) disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=grid_classifier.classes_) disp.plot() plt.show()
输出
这将导致以下结果:
总结
本章使用泰坦尼克号数据集解释了如何在 Python 中实现 XGBoost 模型。为了提高模型的性能,您可以研究其他数据集。