特征集的决策树算法

时间:2019-05-30 22:51:35

标签: python random-forest decision-tree tf-idf naivebayes

我正在尝试根据文字说明('eng')预测更新次数('sys_mod_count')

如果> = 17为1,我已经将'sys_mod_count'预定义为两个类; <17为0。

但是我想删除此条件,因为在现实世界的决策时间该值不可用。

我正在考虑通过决策树/随机森林方法进行此操作,以对功能集上的分类器进行训练。


def train_model(classifier, feature_vector_train, label, feature_vector_valid, is_neural_net=False):
    # fit the training dataset on the classifier
    classifier.fit(feature_vector_train, label)
    # predict the labels on validation dataset
    predictions = classifier.predict(feature_vector_valid)
    # return metrics.accuracy_score(predictions, valid_y)
    return predictions

import pandas as pd
from sklearn import model_selection, preprocessing, linear_model, naive_bayes, metrics, svm
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

df_3 =pd.read_csv('processedData.csv', sep=";")
st_new = df_3[['sys_mod_count','eng','ger']]
st_new['updates_binary'] = st_new['sys_mod_count'].apply(lambda x: 1 if x >= 17 else 0)
st_org = st_new[['eng','updates_binary']]
st_org = st_org.dropna(axis=0, subset=['eng']) #Determine if column 'eng'contain missing values are removed
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(st_org['eng'], st_org['updates_binary'],stratify=st_org['updates_binary'],test_size=0.20)
tfidf_vect = TfidfVectorizer(analyzer='word', token_pattern=r'\w{1,}', max_features=5000)
tfidf_vect.fit(st_org['eng'])
xtrain_tfidf =  tfidf_vect.transform(train_x)
xvalid_tfidf =  tfidf_vect.transform(valid_x)

# Naive Bayes on Word Level TF IDF Vectors
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf, train_y, xvalid_tfidf)
print ("NB, WordLevel TF-IDF: ", metrics.accuracy_score(accuracy, valid_y))


1 个答案:

答案 0 :(得分:0)

这似乎是阈值设置问题-您想设置进行某种分类的阈值。没有监督分类器可以为您设置阈值,因为如果它没有任何带有二进制类的训练数据,那么您将无法训练cvlassifier,并且要创建训练数据,您需要先设置阈值。这是鸡和鸡蛋的问题。

如果您有某种方法可以识别哪个二进制标签正确,则可以改变阈值并测量错误,类似于建议的here。然后,您可以根据阈值在二进制标签上运行分类器,也可以根据sys_mod_count在Regressor上运行分类器,然后根据识别出的阈值将其转换为二进制。

如果您无法识别正确的二进制标签,则上述方法将无效。然后,您要解决的问题是根据sys_mod_count变量的值在点之间创建一些边界。这是无监督的学习。因此,诸如群集之类的技术将在这里有所帮助。您可以根据点之间的距离将数据分为两个群集,然后标记每个群集,这将成为您的二进制标签。