我正在尝试将 sk-learn 的 RandomForestClassifier 用于二进制分类任务(正面和负面示例)。我的训练数据包含 1.177.245 个示例,具有 40 个特征,采用 SVM-light 格式(稀疏向量),我使用 sklearn.dataset 的 load_svmlight_file 加载。它产生一个“特征值”(1.177.245 * 40)的稀疏矩阵和一个“目标类”数组(1和0,其中1.177.245)。我不知道这是否令人担忧,但训练数据有 3552 个正数,其余均为负数。
由于 sk-learn 的 RFC 不接受稀疏矩阵,因此我使用 .toarray() 将稀疏矩阵转换为密集数组(如果我说的没错?很多 0 表示缺少的特征)。我在转换为数组之前和之后打印矩阵,这似乎一切正常。
当我启动分类器并开始将其拟合到数据时,它需要很长时间:
[Parallel(n_jobs=40)]: Done 1 out of 40 | elapsed: 24.7min remaining: 963.3min
[Parallel(n_jobs=40)]: Done 40 out of 40 | elapsed: 27.2min finished
(那个输出对吗?那963分钟大约需要2个半......)
然后我使用 joblib.dump 转储它。当我重新加载它时:
RandomForestClassifier: RandomForestClassifier(bootstrap=True, compute_importances=True,
criterion=gini, max_depth=None, max_features=auto,
min_density=0.1, min_samples_leaf=1, min_samples_split=1,
n_estimators=1500, n_jobs=40, oob_score=False,
random_state=<mtrand.RandomState object at 0x2b2d076fa300>,
verbose=1)
并在真实的训练数据上进行测试(由 750.709 个示例组成,与训练数据的格式完全相同)我得到“意外”的结果。准确地说;测试数据中只有一个示例被归类为真。当我对一半的初始训练数据进行训练并在另一半进行测试时,我根本没有得到任何正面结果。
现在我没有理由相信正在发生的事情有什么问题,只是我得到了奇怪的结果,而且我认为这一切都完成得非常快。进行比较可能是不可能的,但是使用 rt-rank(也有 1500 次迭代,但有一半的核心)在相同的数据上训练一个 RFClassifier 需要超过 12 个小时......
谁能告诉我我是否有理由相信某些事情没有按预期的方式工作?可能是训练数据中正负的比率吗?干杯。