Как избежать несоответствия имен SMOTE? - PullRequest
2 голосов
/ 31 марта 2019

Я строю GBM, чтобы рассчитать что-то с очень низкой вероятностью, и моя модель работает в соответствии со случайными числами с моими характеристиками (т.е. плохо), поэтому я пытаюсь использовать Smote, чтобы преодолеть доминирование моих результатов (98.55%0, 1.45% 1).

Решения здесь , похоже, подразумевают, что моя проблема связана с типом, не являющимся массивом, но мой код подразумевает, что это так.

Мои данные выглядят следующим образом:

X = num_df.drop(columns=[u'Has Claim'])
y = num_df[u'Has Claim']

X
   Underwriting Year  Public Liability Limit  Employers Liability Limit  \
0               2014                 1000000                          0   
1               2014                 5000000                          0   
2               2014                 5000000                   10000000   
3               2014                 2000000                          0   
4               2014                 1000000                          0   
   Tools Sum Insured  Professional Indemnity Limit  \
0                0.0                         50000   
1                0.0                             0   
2             4000.0                             0   
3             2000.0                             0   
4                0.0                       1000000   

   Contract Works Sum Insured  Hired in Plan Sum Insured  Manual EE  \
0                           0                          0          1   
1                           0                          0          1   
2                           0                          0          1   
3                           0                          0          6   
4                           0                          0          1   

   Clerical EE  Subcontractor EE  rand_1  rand_2  rand_3  rand_4  rand_5  \
0            0                 0       1       2       2       1       5   
1            0                 0       4       3       1       2       2   
2            7                 0       2       2       4       1       5   
3            4                 0       5       4       1       2       2   
4            0                 0       4       3       4       5       2   

   rand_6  rand_7  rand_8  rand_9  rand_10  
0       2       3       5       1        1  
1       4       3       1       1        5  
2       2       5       3       1        5  
3       1       5       1       3        2  
4       5       2       5       4        3  

Y
0    0
1    0
2    0
3    0
4    0
Name: Has Claim, dtype: int64

Я делаю тестовый сплит

X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    test_size=0.2, 
                                                    random_state=42)

Когда я подгоняю свою модель, она работает

model.fit(X_train, y_train)
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
   colsample_bytree=0.5, gamma=0, learning_rate=0.1, max_delta_step=0,
   max_depth=5, min_child_weight=1, missing=None, n_estimators=1000,
   n_jobs=1, nthread=4, objective='binary:logistic', random_state=0,
   reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=42, silent=True,
   subsample=0.8)

Однако, если я использую

smt = SMOTE()
X_train, y_train = smt.fit_sample(X_train,
                                  y_train)

, переоборудую мою модель и использую

y_pred = model.predict(X_test)

Тогда я получу

ValueError: feature_names mismatch: ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19'] [u'Underwriting Year', u'Public Liability Limit', u'Employers Liability Limit', u'Tools Sum Insured', u'Professional Indemnity Limit', u'Contract Works Sum Insured', u'Hired in Plan Sum Insured', u'Manual EE', u'Clerical EE', u'Subcontractor EE', u'rand_1', u'rand_2', u'rand_3', u'rand_4', u'rand_5', u'rand_6', u'rand_7', u'rand_8', u'rand_9', u'rand_10']
expected f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f18, f19, f12, f13, f10, f11, f16, f17, f14, f15 in input data
training data did not have the following fields: rand_6, rand_7, rand_4, rand_5, rand_2, rand_3, rand_1, Public Liability Limit, Subcontractor EE, Professional Indemnity Limit, rand_8, rand_9, Manual EE, Employers Liability Limit, rand_10, Contract Works Sum Insured, Underwriting Year, Tools Sum Insured, Clerical EE, Hired in Plan Sum Insured

Я ожидаю, что смогу сделатьпрогнозы с использованием моей обновленной модели

Я неправильно понимаю, как работает SMOTE?Я не правильно его применяю?

...