2013-12-23 2 views
2

Kaggle의 훈련/테스트 세트에서 다항식 NB 분류기를 시도 할 때 홀수 ValueError가 발생합니다. 내 (연습) 목표는 승객이 이름에 따라 남성인지 여성인지를 예측하여 CountVectorizer로 전달하는 것입니다.MultinomialNB : ValueError

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-97-ad69ee9ed02b> in <module>() 
    12 
    13 # classifier prediction - for test set now! 
---> 14 predict_Test = nb.predict(name_test) 
    15 score = accuracy_score(sex_test, predictions, normalize=True) 
    16 print score 

C:\Users\Evan Chow\Anaconda\lib\site-packages\sklearn\naive_bayes.pyc in predict(self, X) 
    61    Predicted target values for X 
    62   """ 
---> 63   jll = self._joint_log_likelihood(X) 
    64   return self.classes_[np.argmax(jll, axis=1)] 
    65 

C:\Users\Evan Chow\Anaconda\lib\site-packages\sklearn\naive_bayes.pyc in _joint_log_likelihood(self, X) 
    455   """Calculate the posterior log probability of the samples X""" 
    456   X = atleast2d_or_csr(X) 
--> 457   return (safe_sparse_dot(X, self.feature_log_prob_.T) 
    458     + self.class_log_prior_) 
    459 

C:\Users\Evan Chow\Anaconda\lib\site-packages\sklearn\utils\extmath.pyc in safe_sparse_dot(a, b, dense_output) 
    81   return ret 
    82  else: 
---> 83   return np.dot(a, b) 
    84 
    85 

ValueError: matrices are not aligned 

내 코드 : 또한

rawDataTrain = pd.read_csv('train.csv') 
trainData = pd.concat([rawDataTrain.Name, rawDataTrain.Sex], axis=1) 

# get name, sex training data 
cv_train = CountVectorizer(min_df = 0) 
cv_train.fit(trainData.Name) 
name_train = cv_train.transform(trainData.Name).toarray() # name_train 
sex_train = np.asarray(trainData.Sex, dtype='S') # name_test 

# get name, sex testing data 
rawDataTest = pd.read_csv('test.csv') 
testData = pd.concat([rawDataTest.Name, rawDataTest.Sex], axis=1) 
cv_test = CountVectorizer(min_df = 0) 
cv_test.fit(testData.Name) 
name_test = cv_test.transform(testData.Name).toarray() # name test 
sex_test = np.asarray(testData.Sex, dtype='S') # sex test 

# classifier prediction - test quickly on training set. you should get 1.0 
predictionsTrain = nb.predict(name_train) 
scoreTrain = accuracy_score(sex_train, predictionsTrain, normalize=True) 
print scoreTrain # returns probability of 1.0 

# classifier prediction - this is what goes weird! 
predict_Test = nb.predict(name_test) 
score = accuracy_score(sex_test, predictions, normalize=True) 
print score 

, name_train의 치수 name_test, sex_train 및 sex_test은 :

(891, 1509) (418, 825 (0120) name_train과 name_test의 첫 번째 좌표는 동일해야하지만, 그렇다면 예측은 훈련 세트와 동일한 샘플 수의 행렬에서만 작동합니다! 이 ValueError를 제거하는 방법에 대한 의견이 있으십니까?

답변

2

치수가 같아야합니다 (예 : 동일한 수의 열). 치수가 있어야합니다. 당신이주는 도형은 다른 것과 똑같은 두 번째 차원을가집니다 (두 번째 차원이 전혀없는 두 가지 차원을 제외하고는 훈련이나 테스트에 사용하는 것이별로 의미가 없습니다).

+1

당신이 말한대로, 훈련 CV를 테스트 세트에 맞추기보다 트레이닝과 테스트를 위해 별도의 CountVectorizer를 만들고 피팅하는 것으로 나타났습니다. 감사! – covariance