Scikit Learn - ValueError:操作数无法一起广播

Posted

技术标签:

【中文标题】Scikit Learn - ValueError:操作数无法一起广播【英文标题】:Scikit Learn - ValueError: operands could not be broadcast together 【发布时间】:2017-11-21 19:54:55 【问题描述】:

我正在尝试在数据集上应用 Gaussian Naive Bayes 模型来预测疾病。当我使用训练数据进行预测时,它运行正确,但是当我尝试使用测试数据进行预测时,它给出了ValueError

runfile('D:/ROFI/ML/心脏病/prediction.py', wdir='D:/ROFI/ML/心脏病') Traceback(最近一次调用最后一次):

文件“”,第 1 行,在 runfile('D:/ROFI/ML/Heart Disease/prediction.py', wdir='D:/ROFI/ML/Heart Disease')

文件“C:\Users\User\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”,第 866 行,在运行文件中 execfile(文件名,命名空间)

文件“C:\Users\User\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”,第 102 行,在 execfile exec(编译(f.read(),文件名,'exec'),命名空间)

文件“D:/ROFI/ML/Heart Disease/prediction.py”,第 85 行,在 预测(x_train,y_train,x_test,y_test)

文件“D:/ROFI/ML/Heart Disease/prediction.py”,第 73 行,在 predict predict_data = model.predict(x_test)

文件“C:\Users\User\Anaconda3\lib\site-packages\sklearn\naive_bayes.py”,第 65 行,在预测中 jll = self._joint_log_likelihood(X)

文件“C:\Users\User\Anaconda3\lib\site-packages\sklearn\naive_bayes.py”,第 429 行,在 _joint_log_likelihood n_ij -= 0.5 * np.sum(((X - self.theta_[i, :]) ** 2) /

ValueError: 操作数不能与形状一起广播 (294,14) (15,)

这里有什么问题?

import pandas
from sklearn import metrics
from sklearn.preprocessing import Imputer
from sklearn.naive_bayes import GaussianNB    

def load_data(feature_columns, predicted_column):

    train_data_frame = pandas.read_excel("training_data.xlsx")
    test_data_frame = pandas.read_excel("testing_data.xlsx")
    data_frame = pandas.read_excel("data_set.xlsx")

    x_train = train_data_frame[feature_columns].values
    y_train = train_data_frame[predicted_column].values

    x_test = test_data_frame[feature_columns].values
    y_test = test_data_frame[predicted_column].values

    x_train, x_test = impute(x_train, x_test)

    return x_train, y_train, x_test, y_test


def impute(x_train, x_test):

    fill_missing = Imputer(missing_values=-9, strategy="mean", axis=0)

    x_train = fill_missing.fit_transform(x_train)
    x_test = fill_missing.fit_transform(x_test)

    return x_train, x_test


def predict(x_train, y_train, x_test, y_test):

    model = GaussianNB()
    model.fit(x_train, y_train.ravel())

    predicted_data = model.predict(x_test)
    accuracy = metrics.accuracy_score(y_test, predicted_data)
    print("Accuracy of our naive bayes model is : %.2f"%(accuracy * 100))

    return predicted_data


feature_columns = ["age", "sex", "chol", "cigs", "years", "fbs", "trestbps", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal", "num"]
predicted_column = ["cp"]

x_train, y_train, x_test, y_test = load_data(feature_columns, predicted_column)

predict(x_train, y_train, x_test, y_test)

注意:两个文件的列数相同。

【问题讨论】:

你能发布完整的堆栈跟踪吗? @EFT 我已经发布了完整的回溯。顺便说一句,我刚刚发现 Imputer 正在删除一列,因为它完全由缺失值组成。有什么办法可以防止吗? 这里没有人拥有您与read_excel("training_data.xlsx") 一起使用的文件。你能用公共数据集重现这个问题吗? 删除列似乎会造成您所看到的不匹配。您可以尝试预先填写该列,或者稍后将其添加回来。文档scikit-learn.org/stable/modules/generated/… 似乎没有提供一种保持空白的方法。我想您至少可以通过在您当前提供给它的数组的转置上使用Imputer(..., axis=1) 来让它在发生这种情况时给出错误。 @MD.KhairulBasar 这很好,很有意义。由于您在其他人发布它之前就找到了它,因此最好将其添加为答案并在可能的情况下接受它,以便将来遇到此错误的任何人都可以在单击找到解决方案之前看到,并且然后在不挖掘 cmets 的情况下找出它是什么。 【参考方案1】:

我发现了错误。由于Imputer 而发生错误。 Imputer 替换数据集中的缺失值。但是,如果任何列完全由缺失值组成,则它会删除该列。在测试数据集中,我有一列完全缺失的数据。所以,Imputer 正在删除它,因此形状与训练数据不匹配,这就是错误的原因。刚刚从充满缺失值的feature_columns 列表中删除了列名并且它起作用了。

【讨论】:

以上是关于Scikit Learn - ValueError:操作数无法一起广播的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中实现逻辑回归时 Scikit-learn ValueError

在管道中使用时带有 scikit-learn PLSRegression 的 ValueError

Scikit Learn - ValueError:操作数无法一起广播

Python Scikit Learn 错误:ValueError:“找到样本数量不一致的输入变量:[4, 10]”

使用 scikit-learn python 的线性 SVM 时出现 ValueError

scikit-learn : ValueError: no enough values to unpack (expected 2, got 1)