我正在训练一个机器学习模型以预测建筑物的价格。
其中一个列是建筑物所在的城市。我有很多城市
Unincorporated County 244550Miami 91486Miami Beach 39880Hialeah 35439Doral 20118Miami Gardens 18031Aventura 18011Homestead 16472Sunny Isles Beach 13587Coral Gables 13365North Miami 10843Cutler Bay 10734North Miami Beach 9592Miami Lakes 6986Palmetto Bay 6039Key Biscayne 5170Pinecrest 4575Hialeah Gardens 4295South Miami 2864Sweetwater 2811Bal Harbour 2794North Bay Village 2767Miami Shores 2764Miami Springs 2689Opa-locka 2632Surfside 2401Bay Harbor Islands 2031Florida City 1924West Miami 921Biscayne Park 717Medley 708El Portal 522Virginia Gardens 370Golden Beach 283Indian Creek 24
这里你可以看到城市列的value_counts(),据我所知,这些例子足够多,可以将其纳入模型中。
问题出现在我要将模型拆分为x_train和x_test或进行交叉验证时。当我使用以下方式拆分数据集时:
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(),还是有更好的方法来拆分数据集,以便在训练和测试分区中使用相同的城市?
回答:
对于这些情况,当你对分类变量进行独热编码时,你需要设置handle_unknown='ignore'
,这样测试集中的未见实例会被忽略,输出矩阵的形状保持不变。
这里有一个简单的例子:
from sklearn.preprocessing import OneHotEncoderX_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.]])