使用Python构建CART决策树回归模型

数据预处理

此次构建模型是根据泰坦迪克号邮轮票价、乘客性别、船上亲友数量等特征信息来预测乘客存活率的模型,使用的数据集为泰坦尼克数据集,下载地址: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必定归西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值