2017-06-19 34 views
0

我試圖在數據集上應用Gaussian Naive Bayes模型來預測疾病。當我使用訓練數據進行預測時,它運行正常,但是當我試圖預測使用測試數據時它正在給出ValueErrorScikit學習 - ValueError:操作數無法一起播放

runfile('D:/ROFI/ML/Heart Disease/prediction.py', wdir='D:/ROFI/ML/Heart Disease') Traceback (most recent call last):

File "", line 1, in runfile('D:/ROFI/ML/Heart Disease/prediction.py', wdir='D:/ROFI/ML/Heart Disease')

File "C:\Users\User\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile execfile(filename, namespace)

File "C:\Users\User\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile exec(compile(f.read(), filename, 'exec'), namespace)

File "D:/ROFI/ML/Heart Disease/prediction.py", line 85, in predict(x_train, y_train, x_test, y_test)

File "D:/ROFI/ML/Heart Disease/prediction.py", line 73, in predict predicted_data = model.predict(x_test)

File "C:\Users\User\Anaconda3\lib\site-packages\sklearn\naive_bayes.py", line 65, in predict jll = self._joint_log_likelihood(X)

File "C:\Users\User\Anaconda3\lib\site-packages\sklearn\naive_bayes.py", line 429, in _joint_log_likelihood n_ij -= 0.5 * np.sum(((X - self.theta_[i, :]) ** 2) /

ValueError: operands could not be broadcast together with shapes (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) 

N.B:兩個文件具有相同的列數。

+0

你可以發佈完整的堆棧跟蹤嗎? – EFT

+0

@EFT我已經發布了完整的追蹤。順便說一句,我剛剛發現'Imputer'正在刪除一列,因爲它完全由缺失值組成。有什麼辦法可以防止這種情況發生? –

+0

沒有人在這裏使用'read_excel(「training_data.xlsx」)''使用的文件。你能用公共數據集重現這個問題嗎? –

回答

1

我發現了這個錯誤。由於Imputer,錯誤發生。 Imputer替換數據集中的缺失值。但是,如果任何列完全由缺失值組成,那麼它將刪除該列。我有一列完整的測試數據集中缺失的數據。因此,Imputer正在刪除,因此形狀與訓練數據不匹配,這就是錯誤的原因。剛從feature_columns列表中刪除了列名,該列表中充滿了缺失值並且工作正常。