项目场景:机器学习SVC进行训练
手游用户流失预测
问题描述
利用LinearSVC进行训练时,报错:
ConvergenceWarning: Liblinear failed to converge, increase the number of iterations
代码如下:
clf = LinearSVC(C=10)
calibrated_clf = CalibratedClassifierCV(base_estimator=clf, cv=3)
calibrated_clf.fit(scaler_all_trainX, all_trainy)
proba = calibrated_clf.predict_proba(scaler_all_testX)
proba
原因分析及方案:
有如下几种可能:
一、已经收敛
- 求解线性 SVM 只是求解二次优化问题。求解器通常是一种迭代算法,它保持对解决方案的运行估计(即,SVM 的权重和偏差)。当解决方案对应于该凸优化问题的最佳目标值时,它会停止运行。
二、还未收敛
- 规范化数据。利用
sklearn
中的StandScaler
函数规范化特征,这不仅可能可以使得结果更好,更可能可以加快训练速度。但需要注意的是,若有离散数据,需要确保它们被正确转换 - 确保
C
等其他参数设置正确,可以调用Optimize
等包来调整参数。 - 如果特征数大于样本数,则需要设置
dual=True
- 设置
max_iter
为更大的值,默认为1000。
结果:
使用几种方法后并没有解决该问题,仅以此记录,以后说不定能用上。
附:尽管最后结果可能看起来还不错,但不应该忽视该问题,因为这意味着LinearSVC在达到收敛之前已经停止了迭代,