Seaborn Regplot и Scikit-Learn Логистические модели рассчитаны по-разному? - PullRequest
0 голосов
/ 28 августа 2018

Я использую функции логистической регрессии Scikit-Learn и Seaborn - первый для извлечения информации о модели (т. Е. Log-odds, параметры и т. Д.), А второй - для построения результирующей сигмоидальной кривой, соответствующей оценкам вероятности. .

Может быть, моя интуиция неверна в том, как интерпретировать этот сюжет, но, похоже, я не получаю результатов, как ожидал:

#Build and visualize a simple logistic regression
ap_X = ap[['TOEFL Score']].values 
ap_y = ap['Chance of Admit'].values

ap_lr = LogisticRegression()
ap_lr.fit(ap_X, ap_y)

def ap_log_regplot(ap_X, ap_y):
    plt.figure(figsize=(15,10))
    sns.regplot(ap_X, ap_y, logistic=True, color='green')
    return None

ap_log_regplot(ap_X, ap_y)
plt.xlabel('TOEFL Score')
plt.ylabel('Probability')
plt.title('Logistic Regression: Probability of High Chance by TOEFL Score')
plt.show

enter image description here

Кажется, все в порядке, но затем я пытаюсь использовать функцию predict_proba в Scikit-Learn, чтобы найти вероятности Chance to Admit при некотором произвольном значении для TOEFL Score (в данном случае 108, 104 и 112):

eight = ap_lr.predict_proba(108)[:, 1]
four = ap_lr.predict_proba(104)[:, 1]
twelve = ap_lr.predict_proba(112)[:, 1]
print(eight, four, twelve)

Где я могу получить:

[0.49939019] [0.44665597] [0.55213799]

Мне кажется, это указывает на то, что оценка TOEFL 112 дает человеку 55% ​​шанс быть принятым на основании этого набора данных. Если бы я продлил вертикальную линию от 112 по оси x до сигмовидной кривой, я бы ожидал пересечение на отметке 0,90.

Правильно ли я интерпретирую / моделирую это? Я понимаю, что использую два разных пакета для расчета коэффициентов модели, но с другой моделью, использующей другой набор данных, мне кажется, что я получаю правильные прогнозы, которые соответствуют логистической кривой.

Есть идеи, или я полностью моделирую / интерпретирую это неточно?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

После некоторых поисков Cross-Validated дал правильный ответ на мой вопрос. Несмотря на то, что он уже существует в перекрестной проверке, я хотел бы также предоставить этот ответ по переполнению стека.

Проще говоря, Scikit-Learn автоматически добавляет штраф за регуляризацию в логистическую модель, которая сокращает коэффициенты. Statsmodels не добавляет этот штраф. Очевидно, что отключить это невозможно, поэтому необходимо установить для параметра C= в экземпляре LogisticRegression какое-то произвольно высокое значение, например C=1e9.

.

После попытки этого и сравнения Scikit-Learn predict_proba() с сигмоидальным графиком, полученным с помощью regplot (который использует statsmodels для его расчета), оценки вероятности совпадают.

Ссылка на полный пост: https://stats.stackexchange.com/questions/203740/logistic-regression-scikit-learn-vs-statsmodels

0 голосов
/ 28 августа 2018
from sklearn.linear_model import LogisticRegression
from sklearn import metrics

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=4)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

logreg = LogisticRegression()
logreg.fit(x_train, y_train)

y_pred = logreg.predict(x_test)
print('log: ', metrics.accuracy_score(y_test, y_pred))

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

...