Попытка Lo git Нелинейная регрессия в Python, вероятность результата не совпадает - PullRequest
0 голосов
/ 06 февраля 2020

У меня проблема с результатами статистики statsmodels glm, пригодными для получения ответа True или false. Я делаю подбор, а затем выполняю преобразование в вероятности, чтобы увидеть вероятность каждого значения x для получения результата. Я использую следующий код, который включает в себя URL-ссылку на набор данных:

import pandas as pd
import numpy as np
import statsmodels.api as sm
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt

#Load dataset wage.
wage = pd.read_csv('https://raw.githubusercontent.com/dsnair/ISLR/master/data/csv/Wage.csv')
wage = wage.iloc[:,1:] #Remove 'Unnamed' column

# The age variable is modified into a 3 degree polynomial
polynomial_feat_3 = PolynomialFeatures(degree=3)
age_poly_3 = polynomial_feat_3.fit_transform(wage['age'].values.reshape(-1,1))

Теперь я хочу получить ответ True (или 1), если заработная плата больше 250 и False (или 0) если оно меньше 250. Поэтому я подхожу к модели glm, используя следующее условие:

age_glm = sm.formula.glm('wage<250 ~ age_poly_3',data=wage,family=sm.families.Binomial()).fit()

sidenote: я ставлю заработную плату менее 250 (wage<250) в качестве условия, потому что таким образом statsmodels алгоритм выдаст мне истинное значение для всех значений выше 250, что вы и ожидаете для wage>250.

Далее я получу предсказания:

age_glm_preds = age_glm.predict() # predict 

И тогда я преобразовать прогнозы в вероятности, используя формулу p = e^n / (1+e^n)

prob = np.exp(age_glm_preds)/(1 + np.exp(age_glm_preds))

Затем я создаю кадр данных, чтобы можно было отсортировать значения x (возраст), а затем построить график:

age_glm_df = pd.DataFrame({'probabilities':prob,
                           'age':wage['age']}).sort_values('age')

Теперь я могу построить график

plt.plot(age_glm_df['age'],age_glm_df['probabilities'])

. И я получаю следующий график, который является неконгруэнтным, потому что подобранная кривая должна начинаться с нуля, потому что здесь она дает 0,5 вероятности получения заработной платы больше, чем 250 людям 18 лет. лет, а это не так. Вероятность получения такого рода заработной платы у 18-летних практически равна нулю. Что пошло не так? Это было подходит GLM? Я потерялся. Пожалуйста, помогите и спасибо за ваше терпение, если вы сделали это так далеко в моем вопросе :) (график ниже)

wage probability plot

...