如何从 CSV 在 Scikit 中执行朴素贝叶斯分类

Posted

技术标签:

【中文标题】如何从 CSV 在 Scikit 中执行朴素贝叶斯分类【英文标题】:How to Perform a Naieve Bayes Classification in Scikit from CSV 【发布时间】:2018-05-22 01:36:17 【问题描述】:

我希望根据存储在 csv 中的几列人口统计数据以及他们的吸烟者状态来预测某人是否吸烟。

使用的列是: 性别、年龄、种族、服役经历、出生国家、教育程度婚姻状况、家庭收入、家庭收入、家庭子女、酒精数量、单位时间、呼吸急促、哮喘、锻炼、吸烟者、吸烟前、吸烟年龄。

所有列都有数字值,但不一定是二进制值。有人可以帮我纠正我的代码,以便在确定吸烟者状态时考虑这些因素,然后帮我衡量分类器的准确性吗?

我有来自类似问题的以下代码:how to Load CSV Data in scikit and using it for Naive Bayes Classification

target_names = np.array(['Positives','Negatives'])

# add columns to your data frame
data['is_train'] = np.random.uniform(0, 1, len(df)) <= 0.75
data['Type'] = pd.Factor(targets, target_names)
data['Targets'] = targets

# define training and test sets
train = data[data['is_train']==True]
test = data[data['is_train']==False]

trainTargets = np.array(train['Targets']).astype(int)
testTargets = np.array(test['Targets']).astype(int)

# columns you want to model
features = data.columns[0:7]

# call Gaussian Naive Bayesian class with default parameters
gnb = GaussianNB()

# train model
y_gnb = gnb.fit(train[features], trainTargets).predict(train[features])

#Predict Output 

【问题讨论】:

只需使用gnb.predict(test[features]) 即可获取预测标签。然后将它们与您的testTargets 进行比较 【参考方案1】:

这里的数据框似乎缺少一行,但我假设你有它。如果您不这样做,请使用pandas.read_csv 读取您的数据。

此外,您的列似乎包含分类数据和数字数据。例如,“SmokedBefore”列可能是 1/0,而“Age”列可能是 20 或 30 等数字。

这会有所不同,因为在“SmokedBefore”中的意图并不是说 1>0。目的是说是/否。如果您的模型假设更高(或更低)更好,那么这将导致问题。因此它是分类的,不应被视为数值。它只是一个标签,表明某人以前是否吸烟。

但是,在“Age”中,的意图是说 30 与 20 乘以 10 不同。因此,它是 numerical 并且应该这样对待。

要解决这个问题,您需要将分类特征转换为另一组二元特征,以平衡这种影响并为您处理。这称为单热编码。而不是“SmokedBefore”上的 1/0,它将变为“is_1”和“is_0”以及相应的数据。像这样,每一列都有一个 1 和一个 0。

您可以简单地使用 sklearn 中提供的onehotencoder 函数。使用 categorical_features 参数指定哪些列具有分类特征

【讨论】:

以上是关于如何从 CSV 在 Scikit 中执行朴素贝叶斯分类的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 朴素贝叶斯类库使用小结

Scikit 学习朴素贝叶斯

SciKit-learn - 训练高斯朴素贝叶斯分类器

Scikit-Learn 朴素贝叶斯分类丨数析学院

处理 scikit learn 的朴素贝叶斯看不见的特征

朴素贝叶斯 scikit 学习警告“DeprecationWarning: Passing 1d arrays”