使用sklearn中GaussianNB报错ValueError的解决方法求助
解决GaussianNB训练时"Unknown label type: (array([0, 1, 2], dtype=object),)"错误
这个错误的根源是标签数组的 dtype 为 object,sklearn 的分类模型要求标签为整数类型(或字符串类别),object 类型的数值数组无法被正确识别。你之前修改X_data为.values不解决问题,因为问题出在标签y的类型上。
解决方案
有两种简单的修复方式:
方式一:提前将标签列转换为整数类型
在生成y_labels后,添加类型转换的代码:
#Setup X and y data df1 = iris[["1_sepal_length", "2_sepal_width",'species']] X_data = df1.iloc[:,0:2] y_labels = df1.iloc[:,2].replace({'setosa':0,'versicolor':1,'virginica':2}).copy() # 新增:将标签转换为整数类型 y_labels = y_labels.astype(int) #Fit model model_sk = GaussianNB(priors = None) model_sk.fit(X_data, y_labels)
方式二:在传入fit时直接转换类型
如果不想修改y_labels本身,也可以在调用fit时临时转换数组类型:
model_sk.fit(X_data, y_labels.values.astype(int))
完整修正代码示例
sns.set() #Load the data set iris = sns.load_dataset("iris") iris = iris.rename(index = str, columns = {'sepal_length':'1_sepal_length','sepal_width':'2_sepal_width', 'petal_length':'3_petal_length', 'petal_width':'4_petal_width'}) #Plot the scatter of sepal length vs sepal width sns.FacetGrid(iris, hue="species", height=7).map(plt.scatter, "1_sepal_length", "2_sepal_width", ).add_legend() plt.title('Scatter plot') #Setup X and y data df1 = iris[["1_sepal_length", "2_sepal_width",'species']] X_data = df1.iloc[:,0:2] y_labels = df1.iloc[:,2].replace({'setosa':0,'versicolor':1,'virginica':2}).copy() # 转换标签为整数类型 y_labels = y_labels.astype(int) #Fit model model_sk = GaussianNB(priors = None) model_sk.fit(X_data, y_labels)
这样修改后,标签数组的 dtype 会变为int64,符合sklearn分类模型的要求,错误即可解决。
内容的提问来源于stack exchange,提问作者BrisS
相关产品推荐
相关产品推荐

