Логистическая регрессия только предсказывает 1 - PullRequest
0 голосов
/ 30 декабря 2018

Я учащийся 10-го класса и работаю над научным ярмарочным проектом, который предполагает прогнозирование приверженности с учетом данных пациентов.Я разделил неделю на 21 временной интервал, три для каждого времени дня (1 - утро понедельника, 2 - полдень понедельника и т. Д.) В переменную day_time.Существует также переменная «день» (1-7) и переменная «время» (1-3 (утро, корма, ночь). Значения приверженности являются двоичными (0 означает, что они не принимали лекарство, 1 означает, что они принимали)Я создал CSV с данными за 30 недель и дал каждому временному интервалу 1 для соблюдения, за исключением 3 выбранных, которые включают в себя «дневной» (2 из 1-3), «четверг»слот (4 из 1-7) и ночной воскресный временной интервал (21 из 1-21). Эти слоты имеют все 0, кроме 1 или 2 исключений. Однако, когда я подгоняю модель логистической регрессии к данным, модельпредсказывает каждое значение приверженности как 1, что приводит к ужасной точности. Я использую Scikit-learn и я использовал параметр class_weight = 'сбалансированный', но это только ухудшило точность. Да, модель начала предсказывать больше, чем 1, ноточность была намного хуже (здесь ниже 0,5).

Ради интереса я смоделировал данные, в которых первые 10 временных интервалов были равны 1, а остальные 11 равны 0, и этот шаблон повторялся для всех30 недельЛогистическая регрессия имела здесь 100% точность.Это заставило меня поверить в то, что модель плохо работала с моим первым набором данных, потому что было намного меньше 0, чем 1.Но затем я смоделировал данные, у которых было примерно одинаковое число 0 и 1 в неделю, но на этот раз они были не все подряд.Эта точная схема повторялась 30 раз, затем модель снова имела точность около 0,5.Я понятия не имею, что вызывает такую ​​ужасную точность.Что-то не так с весами классов или с порогом?Я не должен использовать логистическую регрессию?(надеюсь, так и должно быть, так как правдиво о моей модели выйдет в эту пятницу)

Я использую пакеты scikit для этой модели.

Вот ссылка на листы Google, которые я скачалв качестве csv для моих данных: [https://docs.google.com/spreadsheets/d/1AYJQUt8LcmI3cEKwuOZB2m8EGLAKu5djYQ_Q05Y_PLo/edit?usp=sharing][1]

Вот мой код:

import pandas as pd
%pylab inline
df = pd.read_csv("/Users/neelashabhattacharjee/scfair/patientdata.csv")
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
x = scaler.fit_transform(x)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)

def base_rate_model(x):
     y = np.ones(x.shape[0])
     return y
y_base_rate = base_rate_model(x_test)
from sklearn.metrics import accuracy_score
print("Base rate accuracy is %2.2f" % accuracy_score(y_test, y_base_rate))

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(penalty = 'l2', C = 1, class_weight = None)
model.fit(x_train, y_train)
print("Logistic accuracy is %2.2f" % accuracy_score(y_test, model.predict(x_test)))

from sklearn.metrics import roc_auc_score
from sklearn.metrics import classification_report
print("Base Model:")
base_roc_auc = roc_auc_score(y_test, base_rate_model(x_test))
print("Base Rate AUC = %2.2f" % base_roc_auc)

logit_roc_auc = roc_auc_score(y_test, model.predict(x_test))
print("Logistic AUC = %2.2f" % logit_roc_auc)

# Just some code to help me look more at the predictions of the model and compare it to the actual data

# Display because I am using jupyter notebook

predictions = model.predict(x_test)

display(predictions)

display(y_test)

# How many ones being predicted by model vs real # of ones

ones = 0
for num in y_test:
    if num == 1:
        ones = ones + 1

print("Actual # of ones: {}".format(ones))

predones = 0
for num in predictions:
    if num == 1:
        predones = predones + 1
print("Predicted # of ones: {}".format(predones))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...