Не те же столбцы в разделении по составу поезда для модели машинного обучения Python - PullRequest
1 голос
/ 11 апреля 2020

Я тренирую модель машинного обучения, чтобы предсказать цену здания.

Одна из колонок - в каком городе находится здание. У меня много городов

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

Как я понимаю о ошибка в том, что это проблема одного горячего кодировщика, потому что он принимает каждое значение столбца city и создает новый столбец для каждого города, но когда он разделяется между x_train и x_test, он делает это перед одним горячим кодером, а затем в раздел поезда занимает несколько городов, но в тестовом разделе не следует использовать один и тот же город.

Стоит ли использовать один горячий кодировщик или pd.get_dummies () перед разделом, или есть лучший способ разделить набор данных, чтобы взять города, те же города в железнодорожном и тестовом разделе?

1 Ответ

2 голосов
/ 11 апреля 2020

В этих случаях, когда вы кодируете категориальную переменную 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.]])
...