接着上一篇文章,现在遇到一个情况,就是正样本没有负样本,该怎么训练预测呢?根据案例,现在就是一个小和尚,没有通过女声,那么训练时只有男生的情况。
这在现实中是很常见的,比如流水线上负样本获取成本高,需要产品故障;样本严重的不平衡,相当于只有一个类型的样本;负类样本太过多样化,其存在太过多样化。笔者研究一番后,在此已经阐述过ALL IN Machine Learning,现使用OneClassSVM、IsolationForest来进行训练和预测。
一、训练
整个代码也很简单:
1、样本选择df_male
2、标准正态分布StandardScaler()
3、训练和测试集train_test_split
4、OneClassSVM训练fit
5、预测训练集y_pred_train,并打印错误个数有85
6、预测测试集y_pred_test,并打印错误个数有47
二、预测
但是在下面的直接应用在负样本后发现错误率非常高,基本不可用,情况如下。
1、将负样本正标准正态分布后预测,发现错误率很高,1584个样本有1131个错误。
df_female=df[df['label']==-1]
scaler = StandardScaler()
scaleraer_df_female = scaler.fit_transform(df_female.drop('label', axis=1))
y_pred_female = clf.predict(scaleraer_df_female)
n_error_female = y_pred_female[y_pred_female == 1].size
print(n_error_female)
2、没有正标准正态分布转换,直接预测发现所有样本都无法预测,负样本预测没有错误,但是正样本预测时出现全部错误。
#负样本预测
df_female=df[df['label']==-1]
y_pred_female = clf.predict(df_female.drop('label', axis=1).values)
n_error_female = y_pred_female[y_pred_female == 1].size
print(n_error_female)
#正样本预测
y_pred_male = clf.predict(df_male.drop('label', axis=1).values)
n_error_male = y_pred_male[y_pred_male == -1].size
print(n_error_male)
三、改进模型
接下来笔者不使用标准正态分布StandardScaler(),直接使用原始数据进行训练,并调整参数gamma=1,再次训练。
代码如下:
运行结果如下,错误率明显降低,但是仍不在可以接收范围内,20%错误率确实太高了。但是目前没有头绪来优化,带着问题一步步学习吧。
四、更换 IsolationForest模型
换为隔离森林IsolationForest 模型, 更改模型代码,后面的保持不变。
运行结果如下,比OneClassSVM稍好,但是都停留在20%左右,IsolationForest较低与20%。
五、 IsolationForest模型优化
和label相关的 特征相关性系数如下:
使用相关性系数corr筛选大于0.2的特征,利用筛选后新的特征来进行训练。
运行结果如下,准确率可以达到91%之上。
网友评论