来自 .csv 的 Sklearn 朴素贝叶斯 GaussianNB

Posted

技术标签:

【中文标题】来自 .csv 的 Sklearn 朴素贝叶斯 GaussianNB【英文标题】:Sklearn Naive Bayes GaussianNB from .csv 【发布时间】:2021-10-18 20:13:58 【问题描述】:

我在使用 sklearn 时遇到问题。 当我用“.fit()”训练它时,它会显示 ValueError “ValueError: could not convert string to float: 'Casado'” 这是我的代码: """

from sklearn.naive_bayes import GaussianNB
import pandas as pd



# 1. Create Naive Bayes classifier:
gaunb = GaussianNB()

# 2. Create dataset:
dataset = pd.read_csv("archivos_de_datos/Datos_Historicos_Clientes.csv")
X_train = dataset.drop(["Compra"], axis=1) #Here I removed the last column "Compra"
Y_train = dataset["Compra"] #This one only consists of that column "Compra"
print("X_train: ","\n", X_train)
print("Y_train: ","\n", Y_train)
dataset2 = pd.read_csv("archivos_de_datos/Nuevos_Clientes.csv")
X_test = dataset2.drop("Compra", axis=1)

print("X_test: ","\n", X_test)

# 3. Train classifier with dataset:
gaunb = gaunb.fit(X_train, Y_train) #Here shows "ValueError: could not convert string to float: 'Casado'"


# 4. Predict using classifier:
prediction = gaunb.predict(X_test)

print("PREDICTION: ",prediction)
"""

我使用的数据集是一个 .csv 文件,看起来像这样(但有更多行):

IdCliente,EstadoCivil,Profesion,Universitario,TieneVehiculo,Compra
1,Casado,Empresario,Si,No,No
2,Casado,Empresario,Si,Si,No
3,Soltero,Empresario,Si,No,Si

我正在尝试训练它以确定(使用测试数据集)最后一列是是还是否(Si 或否)

感谢您的帮助,我显然是新手,我不明白我在这里做错了什么

【问题讨论】:

也许朴素贝叶斯分类器正在寻找数字特征? 【参考方案1】:

我会使用 onehotencoder,就像 Lavin 提到的那样,将 yes 或 no 设为数值。像这样的模型无法处理分类数据。

onehotencoder 用于处理是/否、男/女等二进制数据,而标签编码器用于处理 ei、国名 2 个以上的分类数据。

它看起来像这样,但是,您必须对所有分类数据执行此操作,而不仅仅是您的 y 列,并对非二进制列使用标签编码器(超过 2 个变量 - 例如,也许民用体育场)

我还建议删除任何对您的模型没有贡献的因变量,因为即时客户端 ID 听起来可能不会在确定您的因变量时增加任何价值。这是特定于上下文的,但需要牢记。

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [Insert column number for your df])], remainder='passthrough')
X = np.array(ct.fit_transform(X))

对于文档:

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

更多信息: https://contactsunny.medium.com/label-encoder-vs-one-hot-encoder-in-machine-learning-3fc273365621#:~:text=What%20one%20hot%20encoding%20does,which%20column%20has%20what%20value.&text=So%2C%20that's%20the%20difference%20between%20Label%20Encoding%20and%20One%20Hot%20Encoding.

【讨论】:

谢谢!有人告诉我,由于朴素贝叶斯是一个分类器,它允许分类数据。但要么我错过了某事,要么它绝对不允许它..顺便说一句,我尝试了你的方法并且它有效..唯一的问题可能是解码结果。但是,由于这种情况下的答案是二进制的,是或否,非常简单,1 表示是,0 表示否。我对所有这些都使用了 LabelEncoder 只是为了尝试一下,它工作得很好。谢谢!

以上是关于来自 .csv 的 Sklearn 朴素贝叶斯 GaussianNB的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的朴素贝叶斯模型及其应用

sklearn-朴素贝叶斯

python sklearn 不仅使用计数功能进行朴素贝叶斯学习

统计学习方法朴素贝叶斯对鸢尾花(iris)数据集进行训练预测

朴素贝叶斯分类算法的sklearn实现

利用sklearn进行朴素贝叶斯分类