数据预处理
此次构建模型是根据泰坦迪克号邮轮票价、乘客性别、船上亲友数量等特征信息来预测乘客存活率的模型,使用的数据集为泰坦尼克数据集,下载地址:taitanic | Kaggle。
在下载完数据集后,可以先试用 ydata_profiling库(原pandas_profiling库)先对数据进行预先分析,找到缺失值和对预测变量存在显著影响的特征值:
from ydata_profiling import ProfileReport
import pandas as pd
data = pd.read_csv('C:\\gaygayhappy\\Desktop\\titandick.csv')
df = pd.DataFrame(data)
report = ProfileReport(df)
report.to_file(output_file='big_dick.html')
在生成的.HTML文件报告中,可以查看数据集中存在的缺失值、均值,最大值等信息 ,还可自动绘制各个示值间的相互作用图和柱形图、热力图
建立映射字典
import pandas as pd # type: ignore
from sklearn.model_selection import train_test_split # type: ignore
from sklearn.tree import DecisionTreeRegressor, export_graphviz # type: ignore
from sklearn.metrics import mean_squared_error, r2_score # type: ignore
import numpy as np # type: ignore
import graphviz
import pandas as pd
data = pd.read_csv('C:\\gaygayhappy\\Desktop\\titandick.csv')
在训练模型前应当确保下用以训练的特征值中没有字符型出现,可以使用类似R语言因子的方式,创立一个映射字典,将字符型特征值转换为数字特征值
# 打印所有列名
print(data.columns)
输出:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
其中 Sex 的性别特征为字符型,将字符映射为数字可以进行如下操作:
# 创建映射字典
sex_mapping = {
'male': 0,
'female': 1,
'gay': 2
}
data['Sex'] = data['Sex'].map(sex_mapping)
选择特征和目标变量
# 选择特征和目标变量
features = data[['Sex', 'Age', 'Pclass', 'Fare', 'Parch']]
target = data['Survived']
划分数据集
通常可以将数据划分70%~80%用于训练模型,20%~30%用于测试模型。随机种子为确保模型的复现性设置,并非越大越好。
X_train, X_test, y_train, y_test = train_test_split(features, target,test_size=0.2, random_state=123)
训练模型前在查看下数据中有误存在缺失值
# 查看数据数否存在NAN值
nan_count = y_train.isnull().sum()
print(f"NaN values in y_train: {nan_count}")
模型训练
model = DecisionTreeRegressor(
random_state=123,
max_depth=10, # 限制树的最大深度
min_samples_split=4, # 设置拆分节点所需的最小样本数
min_samples_leaf=1 # 设置叶子节点所需的最小样本数
)
model.fit(X_train, y_train)
绘制决策树模型
dot_data = export_graphviz(model, out_file=None, feature_names=X_train.columns,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("titanic_tree", format="pdf", cleanup=True)
display(graphviz.Source(dot_data))
绘制的树模型
绘制模型特征值的基尼指数
一般分类决策树中基尼指数用的较多
fig, ax = plt.subplots(figsize=(10, 6))
viz = FeatureImportances(model, ax=ax)
viz.fit(X_train, y_train)
viz.show()
模型评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
y_pred = model.predict(X_test)
输出:
Mean Squared Error: 0.159004938012737
R^2 Score: 0.35164531942442745
保存训练好的模型
from joblib import dump, load
dump(model, 'titanDicks.joblib')
导入训练好的模型
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from joblib import load
# 指定模型文件的路径
model_path = 'F:\\gayboy\\titanDicks.joblib'
model = load(model_path)
开始预测
# 建议预测对象
jack = {
'Sex': [1],
'Age': [24],
'Pclass': [3],
'Fare': [5],
'Parch': [0]
}
df_predict = pd.DataFrame(jack)
prediction = model.predict(df_predict)
print(prediction)
根据预测结果jack必定归西