# 0.导入工具包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

import os
print("当前工作目录:", os.getcwd())

# 1.读取数据
data1 = pd.read_csv('/root/data/titanic/train.csv')
print(data1.head())
print(data1.info())

# 2. 数据处理
x = data1[['Pclass','Sex','Age']].copy()
y = data1['Survived'].copy()
print(x.head(10))

x['Age'] = x['Age'].fillna(x['Age'].mean())
# 1.首先,检查并转换Age列为数值类型
# x['Age'] = pd.to_numeric(x['Age'],errors='coerce') # 非数字会变成NaN

# 2.然后进行填充
# mean_age = x['Age'].mean()
# x['Age'] = x['Age'].fillna(mean_age)

# 3.验证数据类型
# print(x['Age'].dtype) # 现在应该显示 float64

# - `fillna(...)`: 用指定值填充NaN。
# - `inplace=True`: 直接在原DataFrame `x` 上修改,不创建新对象。
print(x.head(10))

x = pd.get_dummies(x)
# 对特征x中的所有分类变量(此处是`Sex`列,可能还有`Pclass`)进行独热编码
# 原理:将分类值转换为模型可理解的数值形式。
# 例如,`Sex`列(取值'male'和'female')会生成两列:
#   `Sex_female` (是女性则为1,否则为0)
#   `Sex_male`   (是男性则为1,否则为0)
# 注意:`Pclass`(船舱等级)虽然是数字1/2/3,但作为类别处理时也会被编码。
print(x.head(10))

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

# 3.模型训练
# 3.1 决策树
tree = DecisionTreeClassifier()
tree.fit(x_train,y_train)

# 3.2 随机森林
rf = RandomForestClassifier()
rf.fit(x_train,y_train)

# 对决策数的数据,进行网格搜索交叉验证
# n_estimators 这是随机森林特有的参数,tree 决策树只有一棵树,所以无法指定有多少棵树
# params = {'n_estimators':[10,20],'max_depth':[2,3,4,5]}
# model = GridSearchCV(estimator=tree,param_grid=params,cv=3)
# model.fit(x_train,y_train)
# print(model.best_estimator_)

# 3.3 网格搜索交叉验证
params = {'n_estimators':[10,20],'max_depth':[2,3,4,5]}
# 'n_estimators': 森林中决策树的数量。候选值 [10, 20] 表示将尝试用10棵树和20棵树分别建模。
# 'max_depth': 每棵决策树的最大深度。候选值 [2,3,4,5] 表示将尝试这4种不同的深度限制。
model = GridSearchCV(estimator=rf,param_grid=params,cv=3)
#作用:在训练集 (x_train, y_train) 上启动自动化调优流程。GridSearchCV 会进行如下操作:
#将训练集 (x_train, y_train) 再平均分成3份(因为 cv=3)。
#对于参数网格(8种组合)中的每一种组合:
#进行3折交叉验证:用其中2份数据训练,用剩下的1份验证,重复3次,确保每份数据都当过1次验证集。
#计算这3次验证的平均得分(如准确率)。
model.fit(x_train,y_train)
print(model.best_estimator_)
#从8种组合中,选出平均得分最高的那一组参数。
#总计训练次数:8种参数组合 × 3折交叉验证 = 24次完整的模型训练。

# 根据上述网格搜索交叉验证,获取到最优的树分支数 & 每棵树的最大深度
rfs = RandomForestClassifier(max_depth=3,n_estimators=20)
rfs.fit(x_train,y_train)

# 4.模型评估
# 4.1 决策树
print(tree.score(x_test,y_test))

# 4.2 随机森林
print(rf.score(x_test,y_test))

# 4.3 网格搜索交叉验证
print(rfs.score(x_test,y_test))

作者 admin

张宴银,大数据开发工程师

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注