如何用随机森林分类算法处理含字符串特征的航班延误数据
处理含字符串特征的随机森林分类方案
scikit-learn的随机森林模型只能接收数值型特征输入,你代码报错的核心原因就是CARRIER和AIRPORT这两个字符串类型的分类特征没有做数值转换。下面是两种实用的处理方式,根据你的数据情况选择:
1. 标签编码(Label Encoding)
适合特征基数大(比如有上百个机场)的场景,或者特征本身是有序分类的情况。它会把每个唯一字符串映射成一个整数,树模型对这种编码的兼容性很好,不会像线性模型那样产生顺序偏见。
from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import LabelEncoder import pandas as pd # 假设X_train、X_test是DataFrame格式 # 针对每个字符串特征单独创建编码器 le_carrier = LabelEncoder() le_airport = LabelEncoder() # 用训练集数据拟合编码器并转换 X_train['CARRIER'] = le_carrier.fit_transform(X_train['CARRIER']) X_train['AIRPORT'] = le_airport.fit_transform(X_train['AIRPORT']) # 测试集必须用训练集的编码器转换(禁止重新拟合,避免数据泄露) X_test['CARRIER'] = le_carrier.transform(X_test['CARRIER']) X_test['AIRPORT'] = le_airport.transform(X_test['AIRPORT']) # 训练模型 rfc = RandomForestClassifier() rfc.fit(X_train, y_train) y_pred = rfc.predict(X_test)
2. 独热编码(One-Hot Encoding)
适合特征基数小(比如只有几家航空公司)的无序分类场景。它会为每个类别生成一个二进制列,彻底避免模型误判类别间的顺序关系,但基数大时会导致特征维度爆炸。
from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer import pandas as pd # 指定需要编码的字符串列 categorical_cols = ['CARRIER', 'AIRPORT'] # 创建列转换器:仅对分类列做独热编码,其他列保持原样 preprocessor = ColumnTransformer( transformers=[ ('onehot', OneHotEncoder(sparse_output=False, drop='first'), categorical_cols) ], remainder='passthrough' ) # 训练集拟合+转换,测试集仅转换 X_train_processed = preprocessor.fit_transform(X_train) X_test_processed = preprocessor.transform(X_test) # 训练模型 rfc = RandomForestClassifier() rfc.fit(X_train_processed, y_train) y_pred = rfc.predict(X_test_processed)
关键注意事项
- 处理测试集时,必须复用训练集拟合的编码器,绝对不能在测试集上重新调用
fit,否则会引入数据泄露,严重影响模型泛化能力。 - 如果数据里有缺失值,要先填充(比如用该特征的众数)再做编码,否则编码器会报错。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

