我有一个包含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,))
我觉得我的模型评分不佳的原因是因为我在设置目标变量和预测变量方面犯了一个错误。我确实承认,阶级失衡也是一个因素。但是我想知道我的设置是否正确,该问题涉及根据过去的数据预测未来的治疗方法。