我需要对一个相对较小的时间序列数据集进行分类。
训练集维度是 5087 行(分类)乘 3197 列(时间样本),它们是(或据我所知)模型的特征。我还不知道每个样本是否都很重要,稍后我会考虑下采样/过滤/傅立叶变换。
不幸的是,数据集非常不平衡:5087 行中只有 37 行(0.7%)是“正数”。你会如何处理这个问题?我将不得不使用 Scikit-learn 库。
由于这是我第一次使用 Scikit-learn 的方法,我想尝试一个非常简单的分类器,只有很少的超参数,然后从那里开始构建。
首先,选择分类器:逻辑回归,因为这是我能想到的最简单的一个,这只是一个测试。二、通过调整网格选择正则化参数三、选择分割交叉验证策略:我想使用分层引导但不幸的是库没有提供它所以我选择了分层随机分割四、选择度量:cohen's kappa 因为数据集太不平衡了,使精度偏差太大
脚本:
classifier = LogisticRegression(tol=1e-4, max_iter=500, random_state=1)
param_grid = {'C': list(range(3))}
splitter = StratifiedShuffleSplit(n_splits=5, random_state=1)
grid_searcher = GridSearchCV(classifier, param_grid, cv=splitter, scoring=make_scorer(cohen_kappa_score))
model = grid_searcher.fit(train_x, train_y)
首先是“cv = splitter”合法吗?其次,您如何看待这种做法?显然,有了这样一个微不足道的分类器,模型预测的都是负数,我也收到了一些警告:
FitFailedWarning:估计器拟合失败。这些参数在这个训练测试分区上的分数将设置为 nan ZeroDivisionError: float 除以零