本文介绍了:
- 如何将多个标签做onehot,比如说总共有1000个标签,用户带了其中100个标签,那就是一个1000维的feautre,其中100维=1,其余900维=0。
- 调整分类算法的分类阈值,比如将LR中的默认阈值从0调整到0.9,降低recall提升精度。
- 各种算法的使用方式。
1、数据预处理
样本格式
最终得到的样本格式如下,第一列是label,第二列是一“|”分割的一些特征,可以理解为用户观看了哪部电影,喜欢哪本书,关注了哪个微博id等。
label,features
1,20018
0,20006|20025
1,1509|8713|2000341|9010
我们读取数据后,将数据做onehot。比如总共有10000个标签,如果设备带了其中1000个,则标签有10000列,其中1000列为1,其余为0.
import pandas as pd
import sklearn
import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer
载入数据
sample_dir = '/home/ljhn1829/jupyter_data/sklearn_onehot_threshold.csv'
df_sample_all = pd.read_csv(sample_dir)
print(df_sample_all.head())
label features
0 1 2001841
1 0 2000641|2002541
2 1 1509|871305|2000341|901005|147409|132905|13560...
3 1 1034005|20909|9505|1083505|69209|19109|10905|9...
4 1 148009|4109|3809|169105|685006|62409|99805|200...
onehot
除了本文的sklearn方式外,也可以使用pandas.get_dummies()。但数据量比较大,而且稀疏时,建议使用sklearn。
见《sklearn系列之2:数据预处理》及https://stackoverflow.com/questions/63544536/convert-pd-get-dummies-result-to-df-str-get-dummies
mlb = MultiLabelBinarizer(sparse_output=True)
onehot_output = pd.DataFrame.sparse.from_spmatrix(mlb.fit_transform(df_sample_all['features'].str.split('|')),
columns=mlb.classes_)
df_sample_onehot_all = pd.DataFrame()
df_sample_onehot_all['label'] = df_sample_all['label']
df_sample_onehot_all= pd.concat([df_sample_onehot_all,onehot_output], axis=1)
print(df_sample_onehot_all.head())
label 1000005 100008 100009 10001 1000108 10002 1000208 10005 \
0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0
3 1 0 0 0 0 0 0 0 0
4 1 0 0 0 0 0 0 0 0
10007 ... 998805 999008 99905 99908 99909 999505 999508 999708 \
0 0 ... 0 0 0 0 0 0 0 0
1 0 ... 0 0 0 0 0 0 0 0
2 0 ... 0 0 0 0 0 0 0 0
3 0 ... 0 0 0 0 0 0 0 0
4 0 ... 0 0 0 0 0 0 0 0
999805 999808
0 0 0
1 0