如何在sklearn Pipeline中使用自定义特征?

我在使用Python和sklearn进行文本分类。我有一些自定义特征,这些特征是在使用向量化器之外使用的。我想知道是否可以将这些自定义特征与sklearn Pipeline一起使用,以及这些特征在Pipeline中是如何堆叠的。

这是我当前用于分类的代码示例,没有使用Pipeline。如果您发现其中有任何错误,请告诉我,我将非常感激您的帮助。是否有可能以某种方式将其与sklearn Pipeline一起使用?我已经创建了自己的函数get_features(),它提取自定义特征,转换向量化器,缩放特征,最后将它们全部堆叠起来。

import sklearn.svmimport refrom sklearn import metricsimport numpyimport scipy.sparseimport datetimefrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.svm import SVCfrom sklearn.svm import LinearSVCfrom nltk.tokenize import word_tokenize, sent_tokenizefrom sklearn.preprocessing import StandardScaler# 自定义特征示例def words_capitalized(sentence):    tokens = []    # 对句子进行分词    tokens = word_tokenize(sentence)    counter = 0    for word in tokens:        if word[0].isupper():            counter += 1    return counter# 自定义特征示例def words_length(sentence):    tokens = []    # 对句子进行分词    tokens = word_tokenize(sentence)    list_of_length = list()    for word in tokens:        list_of_length.append(length(word))    return list_of_lengthdef get_features(untagged_text, value, scaler):    # 此函数提取自定义特征    # 转换向量化器    # 缩放特征    # 最后将它们全部堆叠起来    list_of_length = list()    list_of_capitals = list()    # 转换向量化器    X_bow = countVecWord.transform(untagged_text)    # 我还看到有些人使用X_bow = countVecWord.transform(untagged_text).todense(),这里的.todense()选项有什么作用?    for sentence in untagged_text:        list_of_urls.append([words_length(sentence)])        list_of_capitals.append([words_capitalized(sentence)])    # 将特征输出转换为numpy向量    X_length = numpy.array(list_of_urls)    X_capitals = numpy.array(list_of_capitals)    if value == 1:        # 对训练集进行拟合转换        X_length = = scaler.fit_transform(X_length)        X_capitals = scaler.fit_transform(X_capitals)    # 如果是测试集    else:        # 仅对测试集进行转换        X_length = = scaler.transform(X_length)        X_capitals = scaler.transform(X_capitals)    # 将所有特征堆叠为稀疏矩阵    X_two_bows = scipy.sparse.hstack((X_bow, X_length))    X_two_bows = scipy.sparse.hstack((X_two_bows , X_length))    X_two_bows = scipy.sparse.hstack((X_two_bows , X_capitals))    return X_two_bowsdef fit_and_predict(train_labels, train_features, test_features, classifier):    # 拟合训练集    classifier.fit(train_features, train_labels)    # 返回分类结果    return classifier.predict(test_features)if  __name__ == '__main__':    input_sets = read_data()    X = input_sets[0]     Y = input_sets[1]     X_dev = input_sets[2]     Y_dev = input_sets[3]     # 初始化计数向量化器    countVecWord = sklearn.feature_extraction.text.CountVectorizer(ngram_range=(1, 3))    scaler= StandardScaler()    # 提取特征    # 对于训练集    X_total = get_features(X, 1, scaler)    # 对于开发集    X_total_dev = get_features(X_dev,  2, scaler)    # 将标签存储为numpy数组    y_train = numpy.asarray(Y)    y_dev = numpy.asarray(Y_dev)    # 训练分类器    SVC1 = LinearSVC(C = 1.0)    y_predicted = list()    y_predicted = fit_and_predict(y_train, X_total, X_total_dev, SVC1)    print "开发集的结果"    precision, recall, f1, _ = metrics.precision_recall_fscore_support(y_dev, y_predicted)    print "精确度: ", precision, " 召回率: ", recall, " F1分数: ", f1

我知道有FeatureUnion,但我不知道它是否可以用于我的目的,以及它是否会缩放和堆叠特征。

编辑:这似乎是一个好的开始: https://michelleful.github.io/code-blog/2015/06/20/pipelines/

我还没有尝试过,尝试后会发布。现在的问题是,我如何在Pipeline中进行特征选择。


回答:

对于任何感兴趣的人,自定义特征类需要有fit和transform函数,然后可以在FeatureUnion中使用。有关详细示例,请查看我在这里的另一个问题 > 如何将不同的输入拟合到sklearn Pipeline中?

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注