我正在尝试使用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个例子组成,与训练数据的格式完全相同)我得到“意外”的结果。确切地说; testdata中只有一个示例被归类为true。当我训练一半初始训练数据并在另一半训练时,我根本没有得到任何肯定。
现在我没有理由相信发生的事情有什么不妥,只是我得到了奇怪的结果,而且我认为这一切都非常快。这可能是不可能进行比较的,但是使用rt-rank(也有1500次迭代,但是使用一半核心)在相同数据上训练RFC分类器需要12个小时......
任何人都可以告诉我,我是否有任何理由相信某些东西不按照预期的方式运作?可能是培训数据中的正数与负数之比?欢呼声。
答案 0 :(得分:4)
事实上,这个数据集非常不平衡。我建议你对负面例子进行二次抽样(例如,随机选择n_positive_samples
),或者对正面例子进行过度抽样(后者更昂贵,但可能会产生更好的模型)。
您是否确定所有功能都是数字功能(较大的值意味着现实生活中的某些内容)?如果其中一些是分类整数标记,那么这些特征应该作为一个k的布尔编码进行分解,而不是随机森林的scikit-learn实现不能直接处理分类数据。