sklearn学习:性别分辨模型2: 优化和评估

上一篇博客中,写到训练了一个分辨性别的模型。用自己分类的数据进行模型训练时,准确率达到90%以上。
但是用另一个训练数据集,准确率只有80%多一点。

因此在优化和评估方面做了一些工作。

1.优化

1.清理数据

把所有预测错误的数据全部找出来进行观察,发现有些数据并不是目标特征数据,这里使用的是商品的brand,但数据集中存在不是brand的信息,因此要进行剔除。等等类似的工作。

2.优化参数

a. SDGClassifier(官方文档

class_weight
调整训练集中不同类型的比例。如women的比例太大,而men的比例太小,则训练结果可能参考意义不大。极端情况下,90%以上结果为women,那么predict值全部为women,正确率也有90%以上,但这样的结果并不可取。因此为了提高性能,需要对训练集进行balance。

对样本数据进行统计分析后发现,所有数据中有11926条数据为women,而只有4903条数据为man,因此需要将比例进行平衡。

如将text_clf中,SGDClassifier中的class_weight设置为“balanced“。

text_clf = Pipeline([('vect',CountVectorizer()),
                         ('tfidf',TfidfTransformer()),
                         ('clf',SGDClassifier(loss='hinge',penalty='l2',
                                              alpha=1e-3,random_state=42,
                                              max_iter=5,tol=None,class_weight='balanced')),
                         ])

模型表现变化,precision_score从0.828提高到0.9499
recal_score从0.9331降低到0.7659

epsilon
这个参数描述的是sensitive,即敏感程度,以SVM二维结果集划分为例,预测结果在多大程度上偏离分割线,容忍度多高。通过调整合理的参数值,提高模型预测的准确性。

这个我修改了很多值,很大很小都有,但是评估的三个结果值都没有变化,暂时还不知道为什么。。。

b. CountVectorizer(官方文档

ngram_range
参数值为tuple类型,需要给定两个值,分别为上下界。
可以设置1-2,即bigram,bigram会一定程度上提高分辨率,用两个词组成的意群来进行分辨,但词的个数过多则没有太大意义,如5个词,一般不会有这么长的意群,也没太大实际意义。

stop_words
停止词,就是要除去的词,不作为特征值进入参考。
参数值类型为string {‘english’},list或者None(by default)
如果用’english’,使用英语的内置停用词表“;
如果一个列表被假定为包含停用词,那么所有这些都将从结果标记中删除。仅适用于analyzer=='word'的情况下;
如果为None,则不会使用停用词。可以将max_df设置为范围[0.7,1.0)中的一个值,以根据术语内部语料库文档频率自动检测和过滤停用词。

max_features
最大的特征值个数,有些特征值出现的频率低,那么可以不进入计算。选择高频率的特征值进行模型训练,在后续的预测中,也可以优化。
参数值类型为int或None(by default)
如果为int型的值,则建立一个仅包含一定数量的高频词汇的词汇表。
如果vocabulary的值不是None,那么该参数设置失效。

analyzer
决定feature应该以单词进行划分还是以字母进行划分。在本例中,字母没有意义,以单词划分。

修改后的代码如下:

text_clf = Pipeline([('vect',CountVectorizer(ngram_range=(1,2),
                                                 stop_words=stop_words,
                                                 max_features=100)),
                         ('tfidf',TfidfTransformer()),
                         ('clf',SGDClassifier(loss='hinge',penalty='l2',
                                              alpha=1e-3,random_state=42,
                                              max_iter=5,tol=None,class_weight='balanced',
                                              epsilon=1000000)),
                         ])

2.评估

除了accuracy, 还可以用precision, recall来进行评估

precision_score(官方文档

sklearn.metrics.precision_score

sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)[source]

其中y_true为实际数据,y_pred为预测数据
返回值类型为浮点型float
用法:

from sklearn import metrics
precision_score = metrics.precision_score(Y_test,predicted)

average参数:

该参数对于多类/多标签目标是必需的。如果采用默认值None,则返回每个分类的分数。
average设置为binary时,参数如果和pos_label一起使用,如将pos_label设置为0或1,则只输出这个分类标签的分数。

binary仅用于结果集为二维分类器的情况下
micro
macro
weighted
samples

recall_score(官方文档

recall_score = metrics.recall_score(Y_test,predicted)

和precision_score的使用很相似,不多赘述。

改进后输出:

accuracy 0.8151240458015268
man_precision_score 0.6247887323943662
women_precision_score 0.9549027720314439
man_recall_score 0.9105090311986864
women_recall_score 0.7760591795561533


初学中,如有问题,请不吝赐教!

猜你喜欢

转载自blog.csdn.net/ninnyyan/article/details/80597085