Прогнозирование невозможно из-за несоответствия функций - PullRequest
0 голосов
/ 24 июня 2019

Я использую sklearn для создания модели логистической регрессии на основе xlsx-файла.Я удалил некоторые целевые и избыточные функции из набора данных.Теперь я хочу сделать прогноз и получить метку на основе нового xlsx-файла для каждой строки файла.

Я могу сохранить и загрузить модель.После запуска прогноза у меня возникает проблема:

'X имеет 37 функций на выборку;ожидая 44 '

Что не так?Спасибо за ваши подсказки.

...
## TRAIN

target = df_HR['Fluktuation'].copy()
type(target)

# remove the target feature and redundant features from the dataset
df_HR.drop(['Fluktuation', 'FTE', 'Mitarbeiternummer',
            'StandardStunden', 'Volljaehrig'], axis=1, inplace=True)
print('Size of Full dataset is: {}'.format(df_HR.shape))

X_train, X_test, y_train, y_test = train_test_split(df_HR,
                                                    target,
                                                    test_size=0.25,
                                                    random_state=7,
                                                    stratify=target) 
## CREATE MODEL AND STORE IT

kfold = model_selection.KFold(n_splits=10, random_state=7)
modelCV = LogisticRegression(solver='liblinear',
                             class_weight="balanced", 
                             random_state=7)
scoring = 'roc_auc'
results = model_selection.cross_val_score(
    modelCV, X_train, y_train, cv=kfold, scoring=scoring)
print(" Logistic Regression algorithm AUC score (STD): %.2f (%.2f)" % (results.mean(), results.std()))

param_grid = {'C': np.arange(1e-03, 2, 0.01)} # hyper-parameter list to fine-tune
log_gs = GridSearchCV(LogisticRegression(solver='liblinear', # setting GridSearchCV
                                         class_weight="balanced", 
                                         random_state=7),
                      iid=True,
                      return_train_score=True,
                      param_grid=param_grid,
                      scoring='roc_auc',
                      cv=10)

log_grid = log_gs.fit(X_train, y_train)
log_opt = log_grid.best_estimator_
results = log_gs.cv_results_

model_file_name = '%s/model.pkl' % modelFolder
joblib.dump(log_gs, model_file_name)

## LOAD MODEL AND PREDICT NEW XLSX FILE
...
df_HRE = df_sourcefileE.copy()
dfColumnsE = df_HRE.columns

leE = LabelEncoder()

le_countE = 0

for col in df_HRE.columns[1:]:
    if df_HRE[col].dtype == 'object':
        if len(list(df_HRE[col].unique())) <= 2:
            leE.fit(df_HRE[col])
            df_HRE[col] = leE.transform(df_HRE[col])
            le_countE += 1
print('{} columns label encoded.'.format(le_countE))

df_HRE = pd.get_dummies(df_HRE, drop_first=True)
#print('df_HRE',df_HRE)

# import MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 5))
HRE_col = list(df_HRE.columns)
#print('datensatz HRE: ', df_HRE)
HRE_col.remove('Fluktuation')
for col in HRE_col:
    df_HRE[col] = df_HRE[col].astype(float)
    df_HRE[[col]] = scaler.fit_transform(df_HRE[[col]])
df_HRE['Fluktuation'] = pd.to_numeric(df_HRE['Fluktuation'], downcast='float')

targetE = df_HRE['Fluktuation'].copy()
type(targetE)

df_HRE.drop(['Fluktuation', 'FTE', 'Mitarbeiternummer',
    'StandardStunden', 'Volljaehrig'], axis=1, inplace=True)


# apply the whole pipeline to data
pred = loaded_model.predict(df_HRE)
print (pred)

1 Ответ

1 голос
/ 24 июня 2019

Похоже, что при обучении исходной модели у вас было 44 столбца данных (функций). Для прогнозирования с использованием этой же модели вам понадобится такое же количество предикторов, в противном случае.

Например, скажем, ваша модель изначально состояла из 3 переменных (x1, x2, x3), где каждая переменная является столбцом в исходном наборе данных, тогда формула регрессии будет выглядеть примерно так:

y=A*x1 + B*x2 + C*x3 + D

Если вы не предоставите х2 или х3 при попытке предсказать, не будет способа применить формулу.

Таким образом, у вас есть два варианта: переобучить модель без семи дополнительных функций (тех, которые появляются в обучающем наборе, а не в наборе прогнозирования) или добавить эти же семь функций в модель прогнозирования со значениями NULL (не рекомендуется) .

...