机器学习模型的训练测试拆分中的列不同 Python
Not same columns in train-est split for machine learning model Python
我正在训练机器学习模型以预测建筑价格。
其中一列是建筑物所在的城市。我有很多城市
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
)
或者我做一个 cross_validation:
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 然后它在 one hot 编码器之前执行,然后在火车的分区中占用一些城市但在测试分区中不要占用同一个城市。
我应该在分区之前做一个热编码器还是 pd.get_dummies(),或者有更好的方法来分割数据集以将城市与训练和测试分区中的城市相同?
对于这些情况,当您对分类变量进行 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.]])
我正在训练机器学习模型以预测建筑价格。
其中一列是建筑物所在的城市。我有很多城市
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
)
或者我做一个 cross_validation:
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 然后它在 one hot 编码器之前执行,然后在火车的分区中占用一些城市但在测试分区中不要占用同一个城市。
我应该在分区之前做一个热编码器还是 pd.get_dummies(),或者有更好的方法来分割数据集以将城市与训练和测试分区中的城市相同?
对于这些情况,当您对分类变量进行 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.]])