我尝试使用BernoulliNB来预测鸢尾花数据集。但训练后的模型对所有测试数据集返回一个随机值作为预测。我使用决策树对相同的数据集进行了尝试,训练后的模型对测试数据集的预测准确率很高。
import pandas as pnimport sklearn as skfrom sklearn.model_selection import train_test_split as lkdef labelmod(x): if(x =='Iris-versicolor'): return 0 elif(x =='Iris-setosa'): return 1 elif(x =='Iris-virginica'): return 3 else: returndef celldif(x): return x.apply(labelmod)ok = pn.read_csv(r"C:\Users\s420105\Desktop\iris.csv",header = None)data=ok.dropna()labels = data.ix[:,4:]labels=labels.apply(celldif)data=data.ix[:,0:3]train_data,test_data,train_label,test_label=lk(data,labels,test_size=0.3)from sklearn.naive_bayes import BernoulliNB classifier = BernoulliNB().fit(train_data,train_label.values.ravel())result= classifier.predict(test_data)result
结果返回array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64) 作为输出
测试和训练标签都没有问题。对于决策树,我传递了不包括values.ravel()的train_label
回答:
你需要做的只是在使用BernoulliNB
之前对数据进行缩放。我使用的是scikit-learn
中的鸢尾花数据集,因为我没有你的CSV文件。但这不是ravel()
的问题,而是数据缩放的问题。
import pandas as pnimport sklearn as skfrom sklearn.model_selection import train_test_split as lkfrom sklearn import datasetsfrom sklearn.naive_bayes import BernoulliNBfrom sklearn.preprocessing import StandardScalerdata = datasets.load_iris().datalabels = datasets.load_iris().targetdata = StandardScaler().fit_transform(data)train_data,test_data,train_label,test_label=lk(data,labels,test_size=0.3)classifier = BernoulliNB().fit(train_data,train_label)result= classifier.predict(test_data)print(result)