#machine-learning #scikit-learn #logistic-regression
Вопрос:
Я пытаюсь пройти одно из соревнований по кагглу, и мне действительно нужна помощь, чтобы понять причину, по которой я получаю прогнозы только одного класса. Я использую следующий код для обучения своей модели и составления прогнозов. Я сделал поразительную передискретизацию(обучающего набора данных) и стандартизацию(подгонку с использованием обучающих данных и валидации преобразования и набора тестовых данных). Поезд(который я разделил на набор данных для обучения и проверки) и набор тестовых данных были предоставлены отдельно. Во время описательного анализа я не обнаружил никаких существенных различий в этих наборах данных. И хотя точность модели все еще далека от совершенства, я получаю несколько более или менее правдоподобных прогнозов по набору данных train и validate. Ситуация ухудшается, когда я использую предоставленный тестовый набор данных.Модель начинает предсказывать только один класс с вероятностью 1. Я буду очень благодарен за любые предложения/идеи, почему это может произойти.
Y = train_agg['purchased']
X = train_agg.loc[:,train_agg.columns!='purchased']
sm =SMOTE()
x_train,x_val,y_train,y_val = train_test_split(X,Y,test_size=0.3)
x_oversampled,y_oversampled = sm.fit_resample(x_train,y_train)
std_scaller = StandardScaler()
std_scaller.fit(x_oversampled)
scalled_trained = std_scaller.transform(x_oversampled)
scalled_val = std_scaller.transform(x_val)
scalled_test = std_scaller.transform(test_agg)
lm = LogisticRegression(C=100, penalty ='l2',max_iter=10000)
trained_model = lm.fit(scalled_trained,y_oversampled)
y_hat_train_proba = trained_model.predict_proba(scalled_trained)
accuracy_score(y_oversampled,y_hat_trained) ##0.6266400643709871
y_hat_train_proba
array([[3.19491598e-01, 6.80508402e-01],
[4.30576210e-01, 5.69423790e-01],
[3.40578197e-01, 6.59421803e-01],
...,
[9.99995964e-01, 4.03559715e-06],
[9.99993259e-01, 6.74137618e-06],
[9.99995683e-01, 4.31695816e-06]])
y_hat_val_proba = trained_model.predict_proba(scalled_val)
array([[0.42875952, 0.57124048],
[0.41301223, 0.58698777],
[0.34379686, 0.65620314],
...,
[0.51039769, 0.48960231],
[0.55606327, 0.44393673],
[0.3920753 , 0.6079247 ]])
y_hat_test_proba = trained_model.predict_proba(scalled_test)
array([[1.00000000e 00, 8.01774792e-93],
[1.00000000e 00, 3.37615445e-95],
[1.00000000e 00, 1.24895157e-95],
...,
[1.00000000e 00, 5.19407695e-94],
[1.00000000e 00, 4.37992193e-97],
[1.00000000e 00, 2.80391555e-96]])
Единственное изменение, которое я внес в тестовый набор данных, — это добавление одного столбца treatment_flg(который был включен в набор данных поезда в качестве предиктора, но не был включен в тестовый набор данных). Это индикатор, который показывает, получил ли клиент звонок или нет. Нам нужно спрогнозировать, каким клиентам нам нужно позвонить, чтобы совершить покупку. Поэтому я заполняю эту колонку цифрой 1, потому что нам нужно знать, какова вероятность получения покупки, если мы обратимся к клиенту. Вероятно, это неправильный подход, и кто-нибудь может меня поправить.
Заранее спасибо.