SKLearn Naive Bayes:在 tfidf 矢量化后添加特征

2024-03-21

因此,我的任务是训练一个电话记录模型。以下代码执行此操作。一些背景信息: - x 是一个字符串列表,每个第 i 个元素是一个完整的转录本 - y 是布尔值列表,表示调用的结果是正还是负。

以下代码有效,但这是我的问题。我想将通话时长作为一项训练功能。我假设在 TFIDF 转换器对转录本进行矢量化之后,我只需将通话持续时间功能连接到 TFIDF 输出,对吗?也许这比我想象的要容易,但是我在代码开头看到的 pandas 数据框中都有文字记录和持续时间。因此,如果我有持续时间的数据框列(numpy 数组),我需要做什么才能将该功能添加到我的模型中?

附加问题:

  • 我是否缺少关于朴素贝叶斯模型的基本假设,该假设将我限制在矢量化字符串上?
  • 我应该在管道的哪一步添加新功能?
  • 这甚至可以在管道中完成吗?还是我必须将其分开才能做这样的事情?

Code:

import numpy as np
import pandas as pd
import random
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import SGDClassifier
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import cross_val_score
from sklearn.feature_selection import SelectPercentile
from sklearn.metrics import roc_auc_score
from sklearn.feature_selection import chi2


def main():
filename = 'QA_training.pkl'
splitRatio = 0.67
dataframe = loadData(filename)
x, y = getTrainingData(dataframe)
print len(x), len(y)

x_train, x_test = splitDataset(x, splitRatio)
y_train, y_test = splitDataset(y, splitRatio)

#x_train = np.asarray(x_train)

percentiles = [10, 15, 20, 25, 30, 35, 40, 45, 50]

MNNB_pipe = Pipeline([('vec', CountVectorizer()),('tfidf', TfidfTransformer()),('select', SelectPercentile(score_func=chi2)),('clf', MultinomialNB())])
MNNB_param_grid = {
#'vec__max_features': (10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000),
'tfidf__use_idf': (True, False),
'tfidf__sublinear_tf': (True, False),
'vec__binary': (True, False),
'tfidf__norm': ('l1', 'l2'),
'clf__alpha': (1, 0.1, 0.01, 0.001, 0.0001, 0.00001),
'select__percentile': percentiles
}
MNNB_search = GridSearchCV(MNNB_pipe, param_grid=MNNB_param_grid, cv=10, scoring='roc_auc', n_jobs=-1, verbose=1)
MNNB_search = MNNB_search.fit(x_train, y_train)
MNNB_search_best_cv = cross_val_score(MNNB_search.best_estimator_, x_train, y_train, cv=10, scoring='roc_auc', n_jobs=-1, verbose=10)

SGDC_pipe = Pipeline([('vec', CountVectorizer()),('tfidf', TfidfTransformer()),('select', SelectPercentile(score_func=chi2)),('clf', SGDClassifier())])
SGDC_param_grid = {
#'vec__max_features': [10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],
'tfidf__use_idf': [True, False],
'tfidf__sublinear_tf': [True, False],
'vec__binary': [True, False],
'tfidf__norm': ['l1', 'l2'],
'clf__loss': ['modified_huber','log'],
'clf__penalty': ['l1','l2'],
'clf__alpha': [1e-3],
'clf__n_iter': [5,10],
'clf__random_state': [42],
'select__percentile': percentiles
}
SGDC_search = GridSearchCV(SGDC_pipe, param_grid=SGDC_param_grid, cv=10, scoring='roc_auc', n_jobs=-1, verbose=1)
SGDC_search = SGDC_search.fit(x_train, y_train)
SGDC_search_best_cv = cross_val_score(SGDC_search.best_estimator_, x_train, y_train, cv=10, scoring='roc_auc', n_jobs=-1, verbose=10)

# pre_SGDC = SGDC_clf.predict(x_test)
# print (np.mean(pre_SGDC == y_test))

mydata = [{'model': MNNB_search.best_estimator_.named_steps['clf'],'features': MNNB_search.best_estimator_.named_steps['select'], 'mean_cv_scores': MNNB_search_best_cv.mean()},
          #{'model': GNB_search.best_estimator_.named_steps['classifier'],'features': GNB_search.best_estimator_.named_steps['select'], 'mean_cv_scores': GNB_search_best_cv.mean()},
          {'model': SGDC_search.best_estimator_.named_steps['clf'],'features': SGDC_search.best_estimator_.named_steps['select'], 'mean_cv_scores': SGDC_search_best_cv.mean()}]
model_results_df = pd.DataFrame(mydata)
model_results_df.to_csv("best_model_results.csv")

据我所知,sklearn 管道是 API 驱动的——管道本身并没有发生真正的魔法。因此,从这个角度来看,您应该能够创建自己的包装器TfidfVectorizer这就是你想要它做的事。例如,假设您有一个如下所示的 DataFrame:

df = pd.DataFrame({'text': ['foo text', 'bar text'], 'duration': [1, 2]})

您可能可以按如下方式实现转换:

class MyVectorizer(object):
    def __init__(self, tfidf_kwargs=None):
        self._tfidf = TfidfVectorizer(**(tfidf_kwargs or None))

    def fit(self, X, y=None):
        self._tfidf.fit(X['text'], y)
        return self

    def fit_transform(self, X, y=None):
        self.fit(X)
        return self.transform(X, copy=False)

    def transform(self, X, copy=True):
        result = self._tfidf.transform(X['text'], copy=copy)
        # result is a sparse matrix.  I'm not sure of a clean way
        # to add a column to a sparse matrix.  If you have the
        # memory, you can use a dense matrix instead...
        return np.column_stack((result, X['duration']))

然后我认为您应该准备好使用它而不是原始的 tfidf 矢量化器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SKLearn Naive Bayes:在 tfidf 矢量化后添加特征 的相关文章

随机推荐

  • jQuery Post blob 对象给出 Uncaught TypeError:非法调用

    我正在尝试使用 jQuery 发布文件post 并得到TypeError Illegal invocation function fbUpload token var dataURL canvas toDataURL image jpeg
  • 我的 java 程序正在运行编译但没有显示任何内容

    package myproj import java sql Connection import java sql DriverManager import java sql PreparedStatement import java sq
  • 使用 Javascript 检查测验答案的最安全方法

    在努力完成一个使用 AJAX PHP 设计匹配问答游戏的项目后 我了解到我公司用于分发其产品的学习套件不允许我在后端运行服务器端脚本来安全地检查答案 这都是由于不幸的等级专制造成的 长话短说 我必须以某种方式检查客户端的答案 或找出一些棘手
  • 使用 DinkToPdf 分隔分页符

    我的 Program cs 中有这个 C var page plain var slnpath Directory GetCurrentDirectory var htmlpath slnpath HtmlTemplates page ht
  • Ruby:在代码块中更改类静态方法

    给定 Thread 类及其当前方法 现在在测试中 我想这样做 def test alter current thread Thread current a stubbed method do something that involve t
  • 如果表尚不存在则创建

    我正在尝试创建一个表 如果它尚不存在 我目前正在检查它是否存在于DBA TABLES首先 如果该查询没有返回任何内容 则插入 有没有办法只签入同一条语句 这样我就不必将其分解为单独的查询 这就是我目前所拥有的 BEGIN SELECT CO
  • AWS DynamoDB Objective C 中递增 Number 属性

    我正在努力增加已保存在 DynamoDB 上的表中的项目的数字属性值 我的代码当前是 AWSDynamoDBUpdateItemInput updateItemInput AWSDynamoDBUpdateItemInput new upd
  • PIG 将文本行转换为稀疏向量

    我必须使用 Apache PIG 将需要合并的文件 第一个文件包含书名列表 就像这样 每个书名都单独一行 Ted Dunning Mahout in Action Leo Tolstoy War and Peace Douglas Adam
  • Angular2 中 Http.DELETE 请求的正文

    我正在尝试与 Angular 2 前端的某种 RESTful API 进行交互 要从集合中删除某些项目 除了删除的唯一 id 可以附加到 url 中 之外 我还需要发送一些其他数据 即身份验证令牌 一些集合信息和一些辅助数据 我发现最直接的
  • django m2m_changed 通过模型自定义

    在 Django 中 我确实有两个模型 作者 和 出版 它们与多对多字段连接 以便我可以将不同的作者分配给出版物 此外 我必须使用自定义的贯穿模型 作者身份 来定义正确的顺序 class Author models Model first
  • 我如何在谷歌应用程序引擎上为 html5 创建 websocket

    这是demo http html5demos com web socket一个简单的聊天客户端 您必须在 webkit 浏览器上打开它 例如 chrome 和 Safari 该演示使用基于node js的Web套接字服务器 websocke
  • 错误:ANDROID_HOME 未设置,并且“android”命令不在您的路径中。您必须至少满足其中一项条件。

    我正在尝试安装 PhoneGap 但收到以下错误 错误 ANDROID HOME 未设置 并且 android 命令不在您的路径中 您必须至少满足其中一项条件 错误 截图 我该如何确保 Android 正确设置以与 Cordova 一起使用
  • Angular2 提供自定义 Http 不起作用

    我们需要一个全局空间来捕获 http 401 403 和 500 响应 我看了一些教程并尝试了扩展 http 的方法 这是我自定义的HTTP 大部分是从网上复制的 import Http ConnectionBackend Request
  • 防止 XAML 中的重复代码

    我在 UniformGrid 中使用了很多 Rectangle 控件 它们含有 XAML 代码的所有相同部分都处理通过 MultiBinding 设置 Fill 属性 请参见下面的示例 有没有办法防止这种代码重复 减少 XAML 代码的首选
  • Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误

    例如 当使用 Facebook API 时 Chrome 或任何其他 webkit 浏览器 会抛出大量 不安全的 JavaScript 尝试使用 URL 访问框架 它不会干扰实际操作 但确实使 javascript 控制台基本无法使用 我想
  • proxy_pass 不使用 /etc/hosts 解析 DNS

    在 Nginx 中proxy pass指令未使用以下命令解析 DNS etc hosts文件 有什么方法可以实现这种可能性 也许利用 Lua 作为最后的手段 如果您有一台带有 systemd 的服务器 您可以使用它附带的名称服务器 syst
  • 如何了解我的 Android 应用在用户设备上消耗了多少电池?

    我正在编写一个应用程序来评估 Android 上蓝牙 P2P 网络的可行性 我注意到 在 Galaxy Nexus 上 它使用的电池很少 而在 Nexus S 上 它消耗电池的速度非常快 这是由于蓝牙导致CPU负载过高直接导致的 现在 我想
  • Camel中如何动态添加和启动路由?

    我正在尝试从 Camel 的路线中删除一些样板 例如 让我们考虑两条相似的路线 并且可以生成它们的大部分内部内容 我创建了一个组件 模板 它创建了TemplateEndpoint 并修改了 XML 配置以使用模板组件 自定义方法Templa
  • 适用于 Android 的自定义旋转对话框

    如何制作自定义主题 Android Spinner 对话框 该博客有一个示例 可能可以解决您的问题 http www mokasocial com 2011 03 easily create a default custom styled
  • SKLearn Naive Bayes:在 tfidf 矢量化后添加特征

    因此 我的任务是训练一个电话记录模型 以下代码执行此操作 一些背景信息 x 是一个字符串列表 每个第 i 个元素是一个完整的转录本 y 是布尔值列表 表示调用的结果是正还是负 以下代码有效 但这是我的问题 我想将通话时长作为一项训练功能 我