Я использую функции логической регрессии Scikit-Learn и Seaborn - первый для извлечения информации о модели (то есть лог-коэффициентов, параметров и т.д.), А позже для построения результирующей сигмоидальной кривой, подходящей для оценок вероятности.
Возможно, моя интуиция неверна для того, как интерпретировать этот сюжет, но я, кажется, не получаю результатов, как я ожидал:
#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
Кажется, все в порядке, но затем я пытаюсь использовать функцию 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 по оси х до сигмовидной кривой, я бы ожидал пересечения около 0,90.
Правильно ли я это интерпретирую/моделирую? Я понимаю, что я использую два разных пакета для расчета коэффициентов модели, но с другой моделью с использованием другого набора данных, я, кажется, получаю правильные прогнозы, которые соответствуют логистической кривой.
Любые идеи или я полностью моделирую/интерпретирую это неточно?
После некоторого поиска Cross-Validated предоставил правильный ответ на мой вопрос. Хотя он уже существует в Cross-Validated, я хотел бы также предоставить этот ответ на Stack Overflow.
Проще говоря, 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
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))
вы можете легко найти такую точность модели и решить, какую модель вы можете использовать для своих данных приложения.