在 Python Pandas 中训练朴素贝叶斯的不同类型的特征

2024-01-18

我想使用许多特征来训练朴素贝叶斯分类器来对“A”或“非 A”进行分类。

我有三个不同值类型的特征: 1)total_length - 正整数 2) 元音比率 - 以小数/分数表示 3)twoLetters_lastName - 包含多个两个字母字符串的数组

# coding=utf-8
from nltk.corpus import names
import nltk
import random
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
from sklearn.naive_bayes import GaussianNB
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

# Import data into pandas
data = pd.read_csv('XYZ.csv', header=0, encoding='utf-8', 
    low_memory=False)
df = DataFrame(data)

# Randomize records
df = df.reindex(np.random.permutation(df.index))

# Assign column into label Y
df_Y = df[df.AScan.notnull()][['AScan']].values # Labels are 'A' or 'non-A'
#print df_Y

# Assign column vector into attribute X
df_X = df[df.AScan.notnull()][['total_length', 'vowel_ratio', 'twoLetters_lastName']].values
#print df_X[0:10]

# Incorporate X and Y into ML algorithms
clf = GaussianNB()
clf.fit(df_X, df_Y)

df_Y如下:

[[u'non-A']
 [u'A']
 [u'non-A']
 ..., 
 [u'A']
 [u'non-A']
 [u'non-A']]

df_X 如下:

[[9L 0.222222222 u"[u'ke', u'el', u'll', u'ly']"]
 [17L 0.41176470600000004
  u"[u'ma', u'ar', u'rg', u'ga', u'ar', u'ri', u'is']"]
 [11L 0.454545455 u"[u'du', u'ub', u'bu', u'uc']"]
 [11L 0.454545455 u"[u'ma', u'ah', u'he', u'er']"]
 [15L 0.333333333 u"[u'ma', u'ag', u'ge', u'ee']"]
 [13L 0.307692308 u"[u'jo', u'on', u'ne', u'es']"]
 [12L 0.41666666700000005
  u"[u'le', u'ef', u'f\\xe8', u'\\xe8v', u'vr', u're']"]
 [15L 0.26666666699999997 u"[u'ni', u'ib', u'bl', u'le', u'et', u'tt']"]
 [15L 0.333333333 u"[u'ki', u'in', u'ns', u'sa', u'al', u'll', u'la']"]
 [11L 0.363636364 u"[u'mc', u'cn', u'ne', u'ei', u'il']"]]

我收到此错误:

E:\Program Files Extra\Python27\lib\site-packages\sklearn\naive_bayes.py:150: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
Traceback (most recent call last):
  File "C:werwer\wer\wer.py", line 32, in <module>
    clf.fit(df_X, df_Y)
  File "E:\Program Files Extra\Python27\lib\site-packages\sklearn\naive_bayes.py", line 163, in fit
    self.theta_[i, :] = np.mean(Xi, axis=0)
  File "E:\Program Files Extra\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 2727, in mean
    out=out, keepdims=keepdims)
  File "E:\Program Files Extra\Python27\lib\site-packages\numpy\core\_methods.py", line 69, in _mean
    ret, rcount, out=ret, casting='unsafe', subok=False)
TypeError: unsupported operand type(s) for /: 'unicode' and 'long'

我的理解是我需要将这些特征转换为一个 numpy 数组作为特征向量,但我不认为我是否正确准备了这个 X 向量,因为它包含非常不同的值类型。


相关问题:选择分类算法对名义数据和数值数据的混合进行分类 https://stackoverflow.com/questions/14274771/choosing-classification-algorithm-to-classify-mix-of-nominal-and-numeric-data?rq=1 -- 使用 Scikit-learn 在朴素贝叶斯分类器中混合类别数据和连续数据 https://stackoverflow.com/questions/14254203/mixing-categorial-and-continuous-data-in-naive-bayes-classifier-using-scikit-lea?rq=1

好吧,有一些事情正在发生。正如 DalekSec 指出的那样,当您将所有特征输入到像这样的模型中时,最佳实践是将它们保留为一种类型GaussianNB。回溯表明,在拟合模型时,它会尝试划分一个字符串(大概是您的 unicode 字符串之一,例如u"[u'ke', u'el', u'll', u'ly']") 乘以一个整数。所以我们需要做的就是将训练数据转换成sklearn可以使用的形式。我们可以通过几种方法来做到这一点,其中 ogrisel 在这个答案中雄辩地描述了其中两种方法here https://stackoverflow.com/a/14255284/4500741.

  1. 我们可以将所有连续变量转换为分类变量。在我们的例子中,这意味着转换total_length(在某些情况下,您可能可以将其视为分类变量,但我们不要超前)并且vowel-ratio。例如,您基本上可以根据百分位将每个功能中看到的值分为 5 个值之一:“非常小”、“小”、“中”、“高”、“非常高”。据我所知,sk-learn 没有真正简单的方法,但自己做应该非常简单。您唯一想要改变的是您想要使用MultinomialNB代替GaussianNB因为您将处理用多项分布而不是高斯分布更好地描述的特征。

  2. 我们可以将分类特征转换为数字特征以供使用GaussianNB。我个人认为这是更直观的方法。基本上,在处理文本时,您需要弄清楚什么信息你想从文本中获取并传递给分类器。在我看来,您想提取不同的两个字母姓氏的出现率。

    通常我会问你数据集中是否有所有姓氏,但由于每个姓氏只有两个字母,我们可以存储所有可能的两个字母名称(包括涉及重音符号的 unicode 字符),影响最小关于性能。这就是 sklearn 之类的东西的地方CountVectorizer可能有用。假设您的数据中有两个字母姓氏的所有可能组合,您可以直接使用它来将twoLetter_lastname列中的一行转换为一个N维向量,该向量记录该行中每个唯一姓氏的出现次数。然后将这个新向量与其他两个特征组合成一个 numpy 数组。

    如果您没有两个字母的所有可能组合(包括带重音的字母),您应该考虑生成该列表并将其作为 CountVectorizer 的“词汇表”传递。这样您的分类器就知道如何处理所有可能的姓氏。如果您不处理所有情况,这并不是世界末日,但在此方案中任何新的未见过的两个字母对都将被忽略。

    在使用这些工具之前,您应该确保将姓氏列作为列表而不是字符串传递,因为这可能会导致意外行为。

    您可以阅读有关一般 sklearn 预处理的更多信息here http://scikit-learn.org/stable/modules/preprocessing.html,以及更多关于CountVectorizer以及sklearn提供的其他文本特征提取工具here http://scikit-learn.org/stable/modules/feature_extraction.html#text-feature-extraction。我每天都会使用很多这些工具,并推荐它们用于基本的文本提取任务。网上还有大量教程和演示。您可能还会寻找其他类型的表示方法,例如二值化和 one-hot 编码。有很多方法可以解决这个问题,这主要取决于您的具体问题/需求。


当您能够将所有数据转换为一种或另一种形式后,您应该能够使用高斯或多项 NB 分类器。至于关于一维向量的错误,您打印了 df_Y ,它看起来像

[[u'non-A']
 [u'A']
 [u'non-A']
 ..., 
 [u'A']
 [u'non-A']
 [u'non-A']]

基本上,它期望它位于平面列表中,而不是列向量(一维列表的列表)。只需使用 numpy.reshape() 或 numpy.ravel() 等命令相应地重塑它(考虑到您只处理一列,如错误所述,numpy.ravel() 可能更合适)。

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

在 Python Pandas 中训练朴素贝叶斯的不同类型的特征 的相关文章

随机推荐

  • 有没有检查 CLS 合规性的工具?

    有没有一个工具可以分析我的 NET 代码 C 和VB NET http en wikipedia org wiki Visual Basic NET 然后告诉我why东西不符合 CLS Visual Studio 很高兴地告诉我一个参数不符
  • 如何只为 pandas 中数据帧的某些列绘制直方图

    这是我拥有的数据 在此输入图像描述 https i stack imgur com EwuSA png 假设我有一个名为 df 的变量中的数据框 如果我执行 df hist 它将为数据框中的每个类别显示一个直方图 但我只想为从类别 1 到类
  • 从 docker-compose 中退出代码打破 while 循环

    我有一个案例 有一个 WordPress 项目 我应该在其中创建一个脚本来更新插件并将源代码更改提交到单独的分支 在这样做时我遇到了一个奇怪的问题 输入变量 akimset 4 0 3 all in one wp migration 6 7
  • 在一条消息 MQTT 中发布多个主题

    我有一个设备可以从不同的传感器收集大量数据 我想通过一条消息将它们发送给我的经纪人 在客户端 我只想在给定时间查看其中一些数据 我不想看到全部数据 我可以在一条消息中发布多个主题 然后在客户端只能看到其中的一些主题吗 我知道我可以使用通配符
  • 如何在打印事件上触发javascript?

    当用户打印页面时是否可以触发javascript事件 当用户选择打印页面时 我想删除对 j avascript 库的依赖 因为该库非常适合屏幕但不适合打印 知道如何实现这一目标吗 对于任何从谷歌偶然发现这个答案的人 让我尝试澄清一下 正如
  • Couchbase/N1QL:从参数提供的值列表中选择

    作为后续从集合中按 类别 获取顶部行 https stackoverflow com questions 72447539 get top rows by category from a collection我仍然想获取每个类别 ID 的前
  • Azure WebJobs - 在哪里托管?它们作为长时间运行的进程安全吗?

    From Azure 网站始终在线 https stackoverflow com questions 26578934 azure website always on and Azure 网站上 始终开启 设置的含义 https stac
  • Android viewModel 保存的StateHandle

    这更多的是一个概念性问题 Android 最近引入了在 viewModel 内部处理进程死亡期间状态的概念 而不是savedInstanceState以前位于 Activity 或 Fragment 中 我的问题是如何测试这个进程的死亡 如
  • 如何在 Robot Framework 中标记数据驱动模板测试

    我有很多数据驱动的测试 这样我就可以对多行 数据运行相同的测试 效果很好 但是 我们还使用 TestRail 并通过 RF 测试上的标签将 RF 测试链接到 TestRail 目前我只为每个模板标记一个 TestRailID 例如 Test
  • 如何在Linux用户空间中实现高精度定时器?

    我的 BeagleBoard 上安装了 Angstrom Linux 我想实现非常精确的计时器 每 500us 触发一次 我读到hrtimers 但我发现的所有实现都是针对内核空间的 我想在用户空间中实现它 有没有可以调用这些的APIhrt
  • React-hook-form 和 Material UI FormControl

    所以我试图为我的表单注册一些单选按钮 但它不会注册
  • ImageMagick 和 Java Runtime Exec 的问题

    我有一个奇怪的问题 我认识的 java 专家都无法解决 我需要在我的应用程序上使用 imagemagick 将我网站上的电子邮件转换为图像 这样就没有锅可以轻松地获取电子邮件 使用 image magick 命令行解决了问题 如下所示转换
  • 为什么 std::initializer_list 会复制项目?

    我一直以为std initializer list是一个轻量级代理对象 它只会从列表项中获取 const 引用 而不是复制它们 但后来我发现在这种情况下实际上执行了复制 struct Test Test std cout lt lt thi
  • 使用 Vue Js 和 Vue Cli 构建 Chrome 扩展

    我目前正在构建一个 Chrome 扩展程序vuejs https vuejs org 供电前端 使用这个效果非常好vuecli https cli vuejs org 直到应用程序开始使用Webextension API 普通网站无法访问此
  • PyQt5 无法导入 QtGui

    我刚刚从 PyQt4 迁移到 5 并且 QtGui 遇到问题 我使用 32 位 Windows 安装程序安装 而不是我自己的版本 当我做 from PyQt5 import QtGui I get class MainWindow QtGu
  • Feign 客户端中不支持 Spring Data Pageable 作为 RequestParam

    我一直在尝试为我的其余 api 公开一个 Feign Client 它采用 Pageable 作为输入并定义了 PageDefaults 控制器 GetMapping value data produces MediaType APPLIC
  • 从 Eclipse 连接到 MySQL (CDT)

    我尝试使用 Eclipse 中的 C 连接到 MySQL 数据库 并参考了互联网上的所有建议 但没有一个是完全有帮助的 我正在使用 Eclipse 和 MinGW 连接到 MySQL 我添加了 C Program Files boost C
  • htaccess 重写传递两个变量或一个取决于两者是否可用?

    我想将第一个目录作为变量传递 将子目录作为另一个变量传递 它适用于具有两个目录 something something2 的 url 但当我尝试仅使用一个目录 something 时 我收到错误 404 RewriteRule posts
  • 在浏览器中渲染 docx 文件

    我正在使用 docx4j 将 microsoft word 文档转换为 pdf 然后在浏览器中显示它http www docx4java org trac docx4j http www docx4java org trac docx4j它
  • 在 Python Pandas 中训练朴素贝叶斯的不同类型的特征

    我想使用许多特征来训练朴素贝叶斯分类器来对 A 或 非 A 进行分类 我有三个不同值类型的特征 1 total length 正整数 2 元音比率 以小数 分数表示 3 twoLetters lastName 包含多个两个字母字符串的数组