机器学习模型训练和测试数据集列不一致问题 Python

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

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

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.]])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注