【问题标题】:How to train Naive Bayes in Python Pandas with str features如何使用 str 特征在 Python Pandas 中训练朴素贝叶斯
【发布时间】:2020-03-07 18:42:16
【问题描述】:

我有一个蘑菇数据集,有 8124 行和 23 列。第一列称为“类”,有两种类型的值:“p”(毒药)和“e”(可食用)。我想使用前 6000 行训练朴素贝叶斯。但我不知道如何使用分类特征来做到这一点。我的数据集中的所有元素都有 str 类型。

import pandas as pd
from sklearn.naive_bayes import GaussianNB

df = pd.read_csv('/home/mot/PythonFiles/Mushrooms/mushrooms.csv', delimiter=',')
df_train = df.loc[:6000]
df_test = df.loc[6000:]

df_train_values = df_train.loc[:, 'cap-shape'::]
df_train_answers = df_train['class']

df_test_values = df_test.loc[:, 'cap-shape'::]
df_test_answers = df_test['class']

clf = GaussianNB()
clf.fit(df_test_values, df_test_answers)

这就是我得到的:ValueError: could not convert string to float: 'p'

【问题讨论】:

  • 创建dummies或使用one-hot-encoding

标签: string pandas naivebayes


【解决方案1】:

实际上,朴素贝叶斯是围绕 P(class|feature) 的思想展开的。因此,如果您有 2 个您提到的类(毒|可食用),那么您想要的朴素贝叶斯概率是:

P(edible|features) = P(edible) * P(cap_shape|edible)/(normalizing_constant)

P(poison|features) = P(poison) * P(cap_shape|poison)/(normalizing_constant)

一般来说,如果你有更多的功能,你会这样做:

P(class_1|features) = P(class_1) * P(feature_1|class_1) * P(feature_2|class_1) * ... * P(feature_n|class_1) . . . P(class_m|features) = P(class_m) * P(feature_1|class_m) * P(feature_2|class_m) * ... * P(feature_n|class_m)

这是朴素贝叶斯的一般方法。可以根据比例从您的训练数据中估计概率,即给定 class_m,在 class_m 中看到 feature_1 的比例。

如果您想知道我为什么不添加除数(归一化常数),那是因为它就是这样 - 一个归一化常数。然而,由于这个原因,需要注意的一点是,由于我们处理的是比例(数字

【讨论】:

  • 谢谢,我已经完成了,而且它似乎正在工作,但我在课堂上得到了两次练习。 1)使用库中的函数训练朴素贝叶斯,2)自己编写朴素贝叶斯分类器。第二个完成了,但我还有一个关于 ex1 的问题。如果我的所有功能都是 str 类型,我如何使用 sklearn 中的 GaussianNB?
  • 您可以使用CountVectorizer 使用vocabulary 参数来获取每行的聚合计数,或者使用上面提到的@AkshayNevrekar 的单热编码或虚拟变量。我没有意识到您已经完成了我建议的上述部分 - 在这方面问题并不完全清楚。除了我提到的或@AkshayNevrekar 做过的方法之外,您是否探索过其他方法?
猜你喜欢
  • 2015-12-18
  • 2013-04-11
  • 2020-06-28
  • 2014-02-21
  • 2015-06-25
  • 2020-01-13
  • 1970-01-01
  • 2019-04-07
  • 2011-01-10
相关资源
最近更新 更多