1. 为什么选择决策树分析泰坦尼克号数据我第一次接触泰坦尼克号数据集是在Kaggle的机器学习竞赛中。这个数据集特别适合机器学习新手练习因为它包含了真实世界数据的典型特征缺失值、类别变量、数值变量混合。决策树算法在这里大显身手它能直观地告诉我们哪些因素决定了乘客的生存概率。决策树最吸引我的地方是它的可解释性。不像黑箱模型那样难以理解决策树的每个判断节点都清晰可见。比如它会先判断乘客是女性吗如果是就进入生存概率较高的分支。这种if-else式的判断逻辑特别符合人类的思考方式。在泰坦尼克号数据集中我们主要关注这几个特征Pclass舱位等级反映社会经济地位Sex性别当时妇女儿童优先的救援原则Age年龄儿童更可能获救Fare票价间接反映经济状况Embarked登船港口可能隐含地域信息import pandas as pd titanic pd.read_csv(titanic.csv) print(titanic.info()) # 查看数据概况运行这段代码你会发现Age字段有缺失值这是真实数据集的典型问题。决策树的一个优势就是能较好地处理缺失值不像某些算法要求严格的数据完整性。2. 数据预处理的关键步骤处理泰坦尼克号数据时我踩过不少坑。最开始直接跑模型准确率只有70%左右。后来发现数据预处理才是提升效果的关键。这里分享几个实用技巧处理缺失值Age字段约20%缺失。我试过三种方法用均值填充简单但可能失准用机器学习预测缺失年龄效果最好但复杂将缺失单独作为一个类别有时效果意外地好# 用中位数填充年龄 titanic[Age].fillna(titanic[Age].median(), inplaceTrue) # 用众数填充Embarked titanic[Embarked].fillna(titanic[Embarked].mode()[0], inplaceTrue)特征工程原始数据中的Name字段看似无用但提取头衔Mr/Miss/Mrs等后成为重要特征titanic[Title] titanic[Name].str.extract( ([A-Za-z])\., expandFalse)编码分类变量Sex和Embarked需要转换为数值。我更喜欢用pd.get_dummies()而不是LabelEncoder因为能避免引入虚假的顺序关系titanic pd.get_dummies(titanic, columns[Sex, Embarked, Title])特征选择不是所有特征都有用。通过探索性分析我发现SibSp(兄弟姐妹/配偶数量)和Parch(父母/子女数量)可以合并为FamilySizetitanic[FamilySize] titanic[SibSp] titanic[Parch] 13. 构建决策树模型的实战技巧在sklearn中构建决策树很简单但调参需要技巧。经过多次实验我总结出这些经验关键参数解析max_depth树的最大深度。太小会欠拟合太大会过拟合。建议从3开始尝试min_samples_split节点分裂的最小样本数。对于大数据集可以增大criterion分裂标准。gini计算更快entropy理论更合理但差异不大from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split X titanic.drop([Survived, Name, Ticket, Cabin], axis1) y titanic[Survived] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) model DecisionTreeClassifier( max_depth5, min_samples_split10, criteriongini, random_state42 ) model.fit(X_train, y_train) print(f准确率: {model.score(X_test, y_test):.2f})避免过拟合决策树特别容易记住训练数据的噪声。我常用的解决方案设置max_depth限制树生长增加min_samples_leaf参数使用交叉验证选择最优参数最终采用随机森林等集成方法from sklearn.model_selection import GridSearchCV params { max_depth: [3, 5, 7], min_samples_split: [2, 5, 10] } grid GridSearchCV(DecisionTreeClassifier(), params, cv5) grid.fit(X_train, y_train) print(f最佳参数: {grid.best_params_})4. 解读决策树与特征重要性训练好的决策树不仅能预测更能解释哪些特征最关键。我常用的分析方法可视化决策树虽然sklearn的tree.plot_tree()可以画图但我更推荐导出为DOT文件后用Graphviz查看from sklearn.tree import export_graphviz export_graphviz( model, out_filetitanic_tree.dot, feature_namesX.columns, class_names[Died, Survived], filledTrue, roundedTrue )特征重要性分析这是决策树最实用的功能之一。可以看到性别和舱位等级的重要性远超其他特征importances pd.DataFrame({ feature: X.columns, importance: model.feature_importances_ }).sort_values(importance, ascendingFalse) print(importances.head(10))业务解读从特征重要性可以还原历史真相女性优先原则使Sex成为最强预测因子一等舱乘客有优先逃生通道年龄影响体现在儿童优先票价高通常意味着更好的舱位位置这些发现与历史记载完全吻合验证了模型的合理性。这也说明好的机器学习项目需要领域知识和数据分析结合。5. 模型评估与改进方案准确率只是开始我通常会从多个角度评估模型混淆矩阵分析from sklearn.metrics import confusion_matrix, classification_report y_pred model.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))学习曲线帮助判断模型是欠拟合还是过拟合from sklearn.model_selection import learning_curve import matplotlib.pyplot as plt train_sizes, train_scores, test_scores learning_curve( model, X, y, cv5, n_jobs-1 ) plt.plot(train_sizes, train_scores.mean(axis1), labelTrain) plt.plot(train_sizes, test_scores.mean(axis1), labelTest) plt.legend() plt.show()改进方向当决策树表现不佳时我会尝试特征工程创建新特征如家庭规模、头衔等集成方法随机森林通常能提升2-5%准确率参数调优用GridSearchCV系统搜索参数组合处理类别不平衡泰坦尼克号数据中幸存者约占38%from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier( n_estimators100, max_depth5, random_state42 ) rf.fit(X_train, y_train) print(f随机森林准确率: {rf.score(X_test, y_test):.2f})在实际项目中我发现在泰坦尼克号数据集上精心调参的决策树可以达到80%左右的准确率而随机森林通常能提升到82-83%。虽然提升不大但更重要的是模型给出的特征重要性排序非常稳定这对业务决策很有价值。