微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择具有大量标签的多标签分类器

如何解决选择具有大量标签的多标签分类器

首先,我对机器学习很陌生,我有这个任务:

我需要构建一个 ML 模型,为客户提供最适合他们数据的 10 个职业列表:学士学位类型、最喜欢的学科、最喜欢的专业领域等...

我和我的团队已经从 sql 数据库提取了信息,并创建了一个包含所有相关信息的数据框,并对其进行了一次热编码:结果如下:

df_all_dumm.shape
(773,1029)

所以我有 773 个客户端和 1029 个列(其中很多,但我们认为这是必要的,因为所有列都是数字分类)。大部分栏目为OHE职业栏目(从99到998),其中“1”表示向客户推荐过该职业,未推荐过则为“0”。

对于这种数据集方法是否适用于多标签分类,以及使用什么方法(NN、RandomTrees classif、scikit 多学习模型......),我有点迷茫。我已经尝试过一些多学习模型,如 MLkNN 或 BRkNNaClassifier,但结果很差(F1 score = 0.1 - 0.2)。

这是数据集(它不包含任何私人数据,所以我认为上传它没有问题。另外,我不知道这是不是粘贴链接的正确方式,再次抱歉)

>

https://drive.google.com/file/d/1nID4q7EfpoiNKdWz6N4FRUgIQEniwFRV/view?usp=sharing

编辑:

我创建了一个 Sequential Keras 模型:

# Slicing target columns from the rest of the df

data = pd.read_csv('df_all_dumm.csv')
data_c = data.copy()
data_in = data_c.copy()
data_c.iloc[:,99:999]
data_out = data_c.iloc[:,99:999]
data_in = data_in.drop(data_out.columns,1)
data_in = data_in.drop(['id'],1)

X_train,X_test,y_train,y_test = train_test_split(data_in,data_out,test_size = 0.3,random_state = 42)

print("{0:2.2f}% of data in train set".format(len(X_train)/len(data.index)*100))
print("{0:2.2f}% of data in test set".format(len(X_test)/len(data.index)*100))

# Dataframes to tensors

X_train_tf = tf.convert_to_tensor(X_train.values)
X_test_tf = tf.convert_to_tensor(X_test.values)
y_train_tf = tf.convert_to_tensor(y_train.values)
y_test_tf = tf.convert_to_tensor(y_test.values)

from numpy import asarray
from sklearn.datasets import make_multilabel_classification
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
 

# get the model
def get_model(n_inputs,n_outputs):
    model = Sequential()
    model.add(Dense(512,input_dim=n_inputs,activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(600,activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(700,activation='relu'))
    model.add(Dense(900,activation='relu'))
    model.add(Dense(n_outputs,activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
    return model
 
# load dataset
X,y = X_train_tf,y_train_tf
n_inputs,n_outputs = X.shape[1],y.shape[1]
# get model
model = get_model(n_inputs,n_outputs)
# fit the model on all data
model.fit(X,y,validation_split=0.33,epochs=100,batch_size=10)


prec = model.evaluate(X_test_tf,y_test_tf)[1]
print("La precisión de la red es: {} %".format(round(prec*100,2)))

La precisión de la red es: 4.74 %

所以,这就是我们创建的模型。我认为这里的主要问题是我们有 900 个不同的输出标签,而我们的数据输入大小是 500...

我们还考虑过首先应用一些聚类算法来对职业进行聚类,比如说 5 个组,为每个组训练一个神经网络,然后进行预测。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。