提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
数据集获取
阿里云天池数据集中下载使用titanic-data.csv
一、代码实现
1.1代码部分解析
1.导入所需库
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
2.数据获取
根据自己文件路径访问即可
T_data = pd.read_csv("titanic-data.csv")
3.筛选特征值、目标值
筛选特征值,从泰坦尼克号数据集 T_data
中选择 Pclass
, Age
, Sex
这三列作为特征。
将 Survived
列作为目标变量,它表示乘客是否存活。
x = T_data[["Pclass", "Age", "Sex"]]
y_target = T_data["Survived"]
4. 数据处理(缺失数据)
采用Age平均值填补缺失数据
x["Age"].fillna(x["Age"].mean(), inplace=True)
5.数据集划分、特征值提取
将划分好的数据集转换为字典类型->进行字典特征值提取
DictVectorizer
会自动将类别型特征(如 Sex
)转换为 one-hot 编码 的形式。例如,Sex
会被转换为两个特征:Sex_female
和 Sex_male
,分别代表女性和男性。
x_train, x_test, y_train, y_test = train_test_split(x, y_target, test_size=0.2, random_state=22)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train) # 拟合+转换为稀疏矩阵
x_test = transfer.transform(x_test)
6.模型训练
(1)参数criterion
gini
(基尼不纯度): 这是默认值,它衡量一个节点中不同类别样本的比例。基尼不纯度越低,说明节点中的样本越纯,即属于同一类别的样本越多。entropy
(信息增益): 信息增益衡量使用某个特征进行划分后,信息的不确定性减少了多少。信息增益越高,说明该特征对分类的贡献度越大。从而选择最佳划分特征。
dtc = DecisionTreeClassifier(criterion="entropy", max_depth=15)
dtc.fit(x_train, y_train)
y_pred = dtc.predict(x_test)
score = dtc.score(x_test, y_test)
print("y_pred:\n", y_pred)
print("比对真实值和预测值:\n", y_test == y_pred)
print("score:\n", score)
7.决策树可视化
(1)生成titan.dot文件
export_graphviz(dtc, out_file="titan.dot", feature_names=transfer.get_feature_names_out())
部分titan.dot文件
(2)决策树显示
二、完整代码展示
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
T_data = pd.read_csv("D:\py\机器学习资料/titanic-data.csv")
"""
1.数据处理:
Age数据缺失,平均值填补
Embarked数据缺失,出现最多数据---众数填补
inplace=True: 表示直接修改原始 DataFrame,而不是创建新的 DataFrame
2.数据转换---字典格式
3.数据集划分
4.字典特征抽取
"""
# 筛选特征值、目标值
x = T_data[["Pclass", "Age", "Sex"]]
y_target = T_data["Survived"]
x["Age"].fillna(x["Age"].mean(), inplace=True)
x_train, x_test, y_train, y_test = train_test_split(x, y_target, test_size=0.2, random_state=22)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train) # 拟合+转换为稀疏矩阵
x_test = transfer.transform(x_test)
dtc = DecisionTreeClassifier(criterion="entropy", max_depth=15)
dtc.fit(x_train, y_train)
y_pred = dtc.predict(x_test)
score = dtc.score(x_test, y_test)
print("y_pred:\n", y_pred)
print("比对真实值和预测值:\n", y_test == y_pred)
print("score:\n", score)
export_graphviz(dtc, out_file="titan.dot", feature_names=transfer.get_feature_names_out())
补充:决策树可视化网址
- Webgraphviz 这个网址可能存在无法访问情况
- Graphviz Online 请采用本网址
总结
1.决策树优化
(1)剪枝:为了防止过拟合,可以通过剪枝技术减少树的复杂度。通过参数max_depth调整
(2)特征值选择:选择对分类或回归有重要贡献的特征,可以提高模型的准确率和泛化能力。
(3)集成学习:随机森林便是决策树的优化使用,通过集成多个决策树来提升模型的性能