目录
- """
- 决策树的应用:对泰坦尼克号数据集成员进行预测生死
- 算法流程还是比较简单的,简单学习一下决策树跟着注释写即可
- 文章参考:https://zhuanlan.zhihu.com/p/133838427
- 算法种遇上sklearn的函数还是比较多的,请将sklearn函数更新到最新
- 更新代码如下所示:
- pip install --upgrade sklearn
- """
- #首先导入需要的包
- from sklearn.model_selection import train_test_split, GridSearchCV
- from sklearn.preprocessing import StandardScaler
- from sklearn.metrics import classification_report
- from sklearn.tree import DecisionTreeClassifier, export_graphviz
- from sklearn.feature_extraction import DictVectorizer
- import pandas as pd
-
- titan= pd.read_csv(r'C:\Users\Zeng Zhong Yan\Desktop\train.csv')
- # 处理数据,找出特征值和目标值
- x = titan[['Pclass', 'Age', 'Sex']]
- y = titan['Survived']
- print(x)
- # 缺失值处理
- x['Age'].fillna(x['Age'].mean(), inplace=True)
- # 分割数据集到训练集和测试集
- x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
- # 进行处理(特征工程)
- dict = DictVectorizer(sparse=False)
- x_train = dict.fit_transform(x_train.to_dict(orient="records"))
- dict = DictVectorizer(sparse=False)
- x_test = dict.fit_transform(x_test.to_dict(orient='records'))
- print(dict.get_feature_names_out())
- #X_test = vec.fit_transform(X_features)
- print(x_train)
- # 用决策树进行预测
- dec = DecisionTreeClassifier()
- dec.fit(x_train, y_train)
- # 预测准确率
- print("预测的准确率为:", dec.score(x_test, y_test))
- # 导出决策树的结构
- export_graphviz(dec, out_file=r"C:\Users\Zeng Zhong Yan\Desktop\py.vs\.vscode\数学建模\decision_tree.dot", feature_names=['Age', 'Pclass', 'Sex=female', 'Sex=male'])
- 算法最终取得的预测正确率:0.78-0.84左右
- 整体上来看波动还是比较大的
- 可能是我的数据集不够多,只有800来个,如果用真正的titanic数据集的话,大概会稳定在0.79-0.82之间
-
- 由于现在各种函数库更新比较快,所以有的时候一个看似正常的函数会一直报错.
- 这个可能与你的库的版本有关,过高或者过低了,没能正确匹配上,我的建议是统一升级到最新版本
-
- 1.bug1:AttributeError: 'DictVectorizer' object has no attribute 'feature_names_out'
- 这个就是典型的版本不符合的问题.
- 我们需要做以下更改:
- #老版本代码
- dict = DictVectorizer(sparse=False)
- x_test = dict.transform(x_test.to_dict(orient='records'))
- print(dict.feature_names_out())
- #新版本代码
- dict = DictVectorizer(sparse=False)
- x_test = dict.fit_transform(x_test.to_dict(orient='records'))
- print(dict.get_feature_names_out())
- #改完就不会报AttributeError: 'DictVectorizer' object has no attribute 'feature_names_out'
-
- 2.bug2:ValueError: Length of feature_names, 4 does not match number of features, 6
- #老版本代码:
- export_graphviz(dec, out_file=r"C:\Users\Zeng Zhong Yan\Desktop\py.vs\.vscode\数学建模\decision_tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'])
- #新版本代码:
- export_graphviz(dec, out_file=r"C:\Users\Zeng Zhong Yan\Desktop\py.vs\.vscode\数学建模\decision_tree.dot", feature_names=['Age', 'Pclass', 'Sex=female', 'Sex=male'])
- #解释:因为你原先报错提示你只有4个长度,却要容下6个特征类,这显然是不对的,但是我们发现Pclass=1st/2nd/3rd本质上就属于'Pclass',所以就简化成4个特征维度了