You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用随机森林分类算法处理含字符串特征的航班延误数据

处理含字符串特征的随机森林分类方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:15:46