【发布时间】:2021-04-17 00:26:18
【问题描述】:
我正在通过重新创建常见的“预测垃圾邮件”项目来研究 Python 中的机器学习和 NLP。我完成了清理和预处理的所有初步步骤,直到我得到一个包含 2,000 个术语的 TF-IDF 文档术语矩阵。然后我执行 SVD 以将其减少到 300 个术语(或组件)并缩放结果,以便我可以运行一个快速的逻辑分类器来为以后的模型获取基准。
在项目后期,在构建随机森林时,我意识到我忘记注释掉下面的缩放器并使用缩放的 SVD 构建森林,这完全没有必要。但是,我没有意识到与未缩放的 SVD 相比,这会减慢随机森林的速度,更糟糕的是,灵敏度也会降低约 10%。
谁能帮我理解为什么会这样?
以下是最佳(最高灵敏度)未缩放 SVD 的网格搜索结果:
Elapsed: 1348 s
Best params: {'max_depth': 20, 'max_features': 250, 'min_samples_split': 10, 'n_estimators': 200}
Confusion matrix on validation set:
pred_neg pred_pos
neg 844 2
pos 5 124
Evaluation metrics:
accuracy: 0.9928
sensitivity: 0.9612
specificity: 0.9976
以下是具有最佳(最高灵敏度)缩放 SVD 的网格搜索结果:
Elapsed: 5297 s
Best params: {'max_depth': 5, 'max_features': 250, 'min_samples_split': 5, 'n_estimators': 200}
Confusion matrix on validation set:
pred_neg pred_pos
neg 838 8
pos 18 111
Evaluation metrics:
accuracy: 0.9733
sensitivity: 0.8605
specificity: 0.9905
这是罪魁祸首:
from scipy.sparse.linalg import svds
from sklearn.utils.extmath import svd_flip
from sklearn.preprocessing import MaxAbsScaler
def perform_SVD(X, n_components=300):
# transpose to a term-document matrix
U, Sigma, VT = svds(X.asfptype().T,
k=n_components)
# reverse outputs
Sigma = Sigma[::-1]
U, VT = svd_flip(U[:, ::-1], VT[::-1])
# transpose to get V
V = VT.T
# scale for logistic classifier only
# can't take log of negative numbers
# ends up predicting ham base rate
# comment out for random forests!
scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(V)
return X_scaled
【问题讨论】:
标签: python machine-learning nlp scaling svd