为何Random Forest Classifier代码无报错但未输出图表及结果?
代码无输出无报错的排查与修复
以下是针对你代码问题的排查方向和修复方案:
1. 数据加载与有效性检查
- 确认
airlines-corgis.csv文件路径正确,若不在脚本同目录,改用绝对路径。 - 加载数据后立即验证数据是否正常:
airline_data = pd.read_csv('airlines-corgis.csv') print(airline_data.shape) # 查看数据行数和列数 print(airline_data.head()) # 查看前5行数据 - 检查目标列
Delayed是否存在、无大量缺失:
如果该列全为NaN或只有单一类别,模型训练和后续输出都会异常。print(airline_data_encoded['Delayed'].info()) print(airline_data_encoded['Delayed'].value_counts(dropna=False))
2. 处理数据缺失与格式问题
- 你对
Time列做了转数值处理但未处理缺失值,这会导致X中存在NaN,影响模型训练:# 用中位数填充Time列的缺失值 airline_data['Time'] = pd.to_numeric(airline_data['Time'], errors='coerce') airline_data['Time'] = airline_data['Time'].fillna(airline_data['Time'].median()) - 检查并处理X中的所有缺失值:
print(X.isnull().sum()) X = X.fillna(X.mean()) # 用均值填充所有数值型缺失值
3. 修复列名空格问题
代码中drop方法里的列名存在多余空格(比如'Delays- NAS'),需修正为匹配数据实际列名:
X = airline_data_encoded.drop( ['Delays-Carrier', 'Delays-LateAircraft', 'Delays-NAS', 'Delays-Security', 'Delays-Weather'], axis=1 )
4. 解决matplotlib显示问题
如果在无GUI环境(如服务器、后台脚本)运行,plt.show()无法弹出窗口,改为保存图片到本地:
plt.figure(figsize=(8, 6)) sns.heatmap(cnf_matrix, annot=True, fmt='.2f', xticklabels=my_forest.classes_, yticklabels=my_forest.classes_) plt.title('Normalized Confusion Matrix') plt.xlabel('Predicted Value') plt.ylabel('True Value') plt.savefig('confusion_matrix.png') # 保存图片 plt.show() # 有GUI环境可保留此句
5. 增加训练过程的验证输出
在关键步骤添加输出,确认流程正常执行:
print('X_train shape:', X_train.shape) print('y_train distribution:\n', y_train.value_counts()) my_forest.fit(X_train, y_train) print('模型训练完成') print('测试集准确率:', metrics.accuracy_score(y_test, y_pred))
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn import metrics # 加载并验证数据 airline_data = pd.read_csv('airlines-corgis.csv') print('原始数据形状:', airline_data.shape) print('原始数据前5行:\n', airline_data.head()) airline_data['CarrierNames'] = airline_data['CarrierNames'].str.split(',') airline_data['TotalCarriers'] = airline_data['CarrierNames'].apply(len) airline_data = airline_data.explode('CarrierNames') # 处理Time列缺失值 airline_data['Time'] = pd.to_numeric(airline_data['Time'], errors='coerce') airline_data['Time'] = airline_data['Time'].fillna(airline_data['Time'].median()) airline_data_encoded = pd.get_dummies(airline_data, columns=['CarrierNames','Code','Name','MonthName']) # 修正列名空格问题 X = airline_data_encoded.drop( ['Delays-Carrier', 'Delays-LateAircraft', 'Delays-NAS', 'Delays-Security', 'Delays-Weather'], axis=1 ) y = airline_data_encoded['Delayed'] # 验证目标列 print('目标列分布:\n', y.value_counts(dropna=False)) # 处理X中的缺失值 X = X.fillna(X.mean()) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=16) print('训练集形状:', X_train.shape) my_forest = RandomForestClassifier() my_forest.fit(X_train, y_train) print('模型训练完成') y_pred = my_forest.predict(X_test) print('测试集准确率:', metrics.accuracy_score(y_test, y_pred)) cnf_matrix = metrics.confusion_matrix(y_test, y_pred, normalize='true') plt.figure(figsize=(8, 6)) sns.heatmap(cnf_matrix, annot=True, fmt='.2f', xticklabels=my_forest.classes_, yticklabels=my_forest.classes_) plt.title('Normalized Confusion Matrix') plt.xlabel('Predicted Value') plt.ylabel('True Value') plt.savefig('confusion_matrix.png') plt.show() print('Length of X_train:', len(X_train)) print('Feature Importances:', my_forest.feature_importances_)
内容的提问来源于stack exchange,提问作者Jenay Spence
相关产品推荐
相关产品推荐

