У меня есть набор данных, который содержит 2 столбца, один из которых является датой, а другой - двоичным результатом события обработки, либо 0 для отсутствия лечения или 1 для обработки.
Dates Events
2010-01-01 0
2010-01-02 1
2010-01-03 0
2010-01-04 1
У меня ровно 2854 строки на 2 столбца. Даты начинаются с
2010-01-01 to 2017-12-31.
Мой набор данных содержит дисбаланс классов из-за характера данных. Количество без лечения составляет 2372 и 482 за лечение. То, что я хочу сделать, это использовать алгоритм классификации, чтобы предсказать, какие даты мне будут лечить, основываясь на моих исторических данных.
Я использовал технику SMOTE, чтобы учесть дисбаланс классов, но я хочу знать, правильно ли я это сделал или где я могу улучшить его, потому что результаты моей модели не самые лучшие. Оценка моделей до следующих
KNN=57.5
Log Reg= 59.61
SVC= 61.72
Decision Tree= 61.72
Random forest= 61.72
Gradient boost= 61.72
Naive Bayes= 57.59
Я также добавил год, месяц, неделю и день недели в свой фрейм данных.
df=pd.read_csv('Binary Data.csv')
df['year'] = pd.DatetimeIndex(df['Dates']).year
df['month']=pd.DatetimeIndex(df['Dates']).month
df['week']=pd.DatetimeIndex(df['Dates']).week
df['weekday']=pd.DatetimeIndex(df['Dates']).weekday
df.head()
Dates Events year month week weekday
2010-03-10 0 2010 3 10 2
2010-03-11 1 2010 3 10 3
2010-03-12 0 2010 3 10 4
2010-03-13 0 2010 3 10 5
2010-03-14 0 2010 3 10 6
Ранее я получал более высокие оценки по моей модели, игнорируя дисбаланс классов и используя обычные даты. Все модели набрали 84%, но я понял, что они просто предсказывают, когда у меня нет обработок, потому что это большинство данных. Поэтому я изменил свой код, чтобы учесть дисбаланс классов, и перешел на использование значений дня недели.
Выбор моего предиктора и целевых переменных:
X=df.weekday.values
y=df.Events.values
X=X.reshape(-1, 1)
X.shape, y.shape
(2854, 1), (2854,)
Учет дисбаланса класса с использованием SMOTE:
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=0, ratio=1.0)
X, y = sm.fit_sample(X, y)
Обучение и тестирование:
X_train, X_test, y_train, y_test = train_test_split(X, y,stratify=y,
test_size=0.25, random_state=0)
X_train.shape, y_train.shape, X_test.shape, y_test.shape
((3558, 1), (3558,), (1186, 1), (1186,))
Мне кажется, что причина, по которой мои оценки по модели плохие, заключается в том, что я делаю ошибку в том, как я устанавливаю свои цели и переменные предиктора. Я признаю, что дисбаланс классов также является фактором. Но я хотел бы знать, правильна ли моя установка для проблемы, которая включает в себя прогнозирование будущих обработок на основе прошлых данных.