【问题标题】:Not same columns in train-est split for machine learning model Python机器学习模型 Python 的训练测试拆分中的列不同
【发布时间】:2020-07-24 04:08:20
【问题描述】:

我正在训练一个机器学习模型来预测建筑价格。

其中一列是建筑物所在的城市。我有很多城市

Unincorporated County    244550
Miami                     91486
Miami Beach               39880
Hialeah                   35439
Doral                     20118
Miami Gardens             18031
Aventura                  18011
Homestead                 16472
Sunny Isles Beach         13587
Coral Gables              13365
North Miami               10843
Cutler Bay                10734
North Miami Beach          9592
Miami Lakes                6986
Palmetto Bay               6039
Key Biscayne               5170
Pinecrest                  4575
Hialeah Gardens            4295
South Miami                2864
Sweetwater                 2811
Bal Harbour                2794
North Bay Village          2767
Miami Shores               2764
Miami Springs              2689
Opa-locka                  2632
Surfside                   2401
Bay Harbor Islands         2031
Florida City               1924
West Miami                  921
Biscayne Park               717
Medley                      708
El Portal                   522
Virginia Gardens            370
Golden Beach                283
Indian Creek                 24

在这里你可以看到列城市的value_counts(),据我了解,有足够的例子可以将其包含到模型中。

当我想将模型拆分为 x_train 和 x_test 或进行 cross_validation 时,问题就来了。当我使用以下方法拆分数据集时:

X_train, X_test, y_train, y_test = train_test_split(
    df_x, df_y,
    test_size=0.33, random_state=180
)

或者我做一个交叉验证:

score2 = cross_validate(estimator_pipeline, X= df_x, y= df_y, 
scoring=scoring,return_train_score=False, cv=5,n_jobs=2)

我收到此错误:

Found unknown categories ['El Portal', 'Florida city, 'Medley'] in column 1 during transform

据我了解,该错误是一个热编码器的问题,因为获取列城市的每个值并为每个城市创建一个新列,但是当它在 x_train 和 x_test 之间拆分时,它会在之前一个热编码器,然后在火车的分区中采取一些城市,但在测试分区中不采取同一个城市。

我应该在分区之前做一个热编码器还是 pd.get_dummies() ,还是有更好的方法来拆分数据集以将城市与火车和测试分区中的城市相同?

【问题讨论】:

  • train_test_split 中尝试stratify=df_y 参数。

标签: python machine-learning scikit-learn train-test-split


【解决方案1】:

对于这些情况,当您对分类变量进行 OneHot 编码时,您希望设置 handle_unknown='ignore',以便忽略测试集中看不见的实例,并且输出矩阵具有相同的形状。

这是一个简单的例子:

from sklearn.preprocessing import OneHotEncoder

X_train = pd.Series(['West Miami', 'Biscayne Park', 'Medley'])
oh = OneHotEncoder(handle_unknown='ignore')
oh.fit(X_train.values[:,None])

oh.transform(X_train.values[:,None]).toarray()

array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

如果我们用一个看不见的城市变换下面的测试集,得到的矩阵的形状保持不变:

X_test = pd.Series(['West Miami', 'Biscayne Park', 'Atlanta'])

oh.transform(X_test.values[:,None]).toarray()

array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 0., 0.]])

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2016-12-03
    • 2018-06-12
    • 2017-10-09
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2020-02-21
    • 2020-07-01
    相关资源
    最近更新 更多