2017-10-15 134 views
-3

當前正在編寫一些機器學習,其中我使用了sklearn,numpy和scipy。我能夠解析我的數據庫並準備數據集。但是來預測時,輸出的結果,我收到以下錯誤:TypeError:'tuple'對象不可調用Python

類型錯誤:「元組」對象不是可調用

我的代碼如下:

from sklearn.svm import SVC 
from sklearn.naive_bayes import GaussianNB 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.linear_model import SGDClassifier 
from sklearn import tree 
from sklearn import gaussian_process 
from sklearn import neural_network 
from sklearn import preprocessing 
from time import time 
import numpy as np 

t0 = time() 

classifier = int(input(
""" 
Enter number corresponding to classifier you would like to use: 
1. Support Vector Machines 
2. Gaussian Naive Bayes 
3. Multinomial Naive Bayes 
4. Stochastic Gradient Descent with Logistic Regression loss function 
""")) 

dataset = int(input(
""" 
Enter number corresponding to data set you would like to use: 
1. First half and second half 
2. Alternating 
3. Alternating with attack type 
4. Alternating with attack type and target type 
""")) 

# Assign appropriate datasets 
input_files = ['half', 'alternating', 'alternating-with-attacktype', 'alternating-all'] 
filename = input_files[dataset-1] 

# Instantiate arrays for inputs and outputs 
train_inputs = [] 
train_outputs = np.array([]) 

test_inputs = [] 
test_expected_outputs = np.array([]) 
test_actual_outputs = [] 
X = np.array([]) 
# Read training file 
print ('Reading training file') 
t = time() 

for line in open('datasets/%s-train.txt' % filename): 
    inputs = line.split(' ') 
    outputs = inputs.pop() 
    train_outputs = np.append(train_outputs, int(outputs)) 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

# for line in open('datasets/%s-train.txt' % filename): 
# inputs = line.split(' ') 
# output = inputs.pop() 
# train_outputs = np.append(train_outputs, int(output)) 
# print ('Done. Time taken: %f secs.\n' % (time()-t)) 

print ('Create classifier') 
t = time() 
clf = None 

# No preprocessing for SVMs 
# Otherwise, scale inputs (preprocessing to make more amenable for machine learning) 
if classifier == 1: # Support vector machines 
    clf = SVC() 
elif classifier == 2: # Gaussian Naive Bayes 
    train_inputs = preprocessing.scale(np.array(train_inputs)) 
    clf = GaussianNB() 
elif classifier == 3: # Multinomial Naive Bayes 
    clf = MultinomialNB() 
elif classifier == 4: # Stochastic gradient descent with logistic regression 
    train_inputs = preprocessing.scale(np.array(train_inputs)) 
    clf = SGDClassifier(loss='log') 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

print ('Fit classifier') 
t = time() 
X.shape(1 -1) 
clf.fit(train_inputs, train_outputs) 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

# Read test file and scale inputs 
print ('Reading test file') 
t = time() 
for line in open('datasets/%s-test.txt' % filename): 
    inputs = line.split(' ') 
    output = inputs.pop() 
    test_expected_outputs = np.append(test_expected_outputs, int(output)) 
    test_inputs.append(map(float, inputs)) 

# Same here: no preprocessing for SVMs 
# Otherwise, scale inputs (preprocessing to make more amenable for machine learning) 
if classifier != 1: 
    test_inputs = preprocessing.scale(np.array(test_inputs)) 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

print ('Predict for test file') 
t = time() 
test_actual_outputs = [clf.predict(i)[0] for i in test_inputs] 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

print ('Compare outputs') 
t = time() 
right = sum(test_actual_outputs == test_expected_outputs) 
wrong = len(test_actual_outputs) - right 
print ('Done. Time taken: %f secs.\n' % (time()-t)) 

print ('Number right: %d\nNumber wrong: %d' % (right, wrong)) 
print ('Prediction rate: %.2f%%' % (100.0 * right/len(test_actual_outputs))) 
print ('Total time taken: %f secs.\n' % (time()-t0)) 

我知道我需要添加array.reshape(-1 1)或array.reshape(1 -1),但不知道這會做什麼。

任何關於如何解決這個問題的建議都會受到歡迎。

+5

請:一[MCVE。你也*絕對*必須在你的問題中提供**完整的追溯**。 –

+1

什麼是完整的回溯,所以我們可以看到什麼引發了錯誤,而無需挖掘代碼? – roganjosh

+1

1.這是一個很長的程序 - 嘗試創建一個最小的,最好是自包含的例子,它重現了錯誤 2.發佈完整的錯誤消息(不清楚程序在哪一行失敗) 3.試着步入帶有調試器的程序 - 它可能會幫助你理解問題所在 –

回答

0

此錯誤是由行來:

X.shape(1 -1) 

使用X.shape代替。

這裏的問題的再現:

X = pd.Series() 
X.shape(1 -1) 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-105-1bb3332dc7d5> in <module>() 
     1 X = pd.Series() 
----> 2 X.shape(1 -1) 

TypeError: 'tuple' object is not callable