2017-10-13 4 views
1
model = LogisticRegression() 
model = model.fit(X, y) 
test_data = [1,2,3,4,5,6,7,8,9,10,11,12,13] 
test_prediction = model.predict_proba(np.array(test_data)) 
max = -1.0 
res = 0 
for i in range(test_prediction): 
    if test_prediction[i]>max: 
     max = test_prediction[i] 
     res = i 
if res==0: 
    print('A') 
elif res==1: 
    print('B') 
else: 
    print('C') 

Mit dem obigen Python-Code muss ich die Wahrscheinlichkeiten der 3 möglichen Ergebnisse vorhersagen (A, B, C). Die Wahrscheinlichkeiten sind in test_prediction gespeichert und es kann als gedruckt werden:TypeError für predict_proba (np.array (test))

Output: [[ 0.82882588 0.08641236 0.08476175]] 

Aber der restliche Teil einen Fehler gibt:

for i in range(test_prediction): 
TypeError: only integer scalar arrays can be converted to a scalar index 

Ich möchte die maximale Wahrscheinlichkeit finden und dann das Ereignis anzuzeigen, das ist wahrscheinlich am häufigsten auftreten (A/B/C). Wie geht das?

+0

In Zukunft fügen Sie bitte einen Code hinzu, der reproduzierbar ist. –

Antwort

1

Sie können auch numpy.argmax verwenden, die Ihnen direkt den Index des größten Wertes geben wird.

import numpy as np 

#test_prediction is most probably np array only 
pred = np.array(test_prediction) 

classes_val = np.argmax(pred, axis=1) 
for res in class_val: 
    if res==0: 
     print('A') 
    elif res==1: 
     print('B') 
    else: 
    print('C') 
+0

Danke, dass mein Problem gelöst hat – Enzy

0

Sie können etwas tun:

predict_prob_df = pd.DataFrame(model.predict_proba(test_data)) 
max_prob = predict_prob_df.apply(max,axis = 1) 
predicted_output = pd.DataFrame(model.predict(test_data)) 

Dann können Sie verketten sie:

final_frame = pd.concat([max_prob,predicted_output],axis = 1) 

Auf diese Weise brauchen Sie nicht die for-Schleife zu verwenden, die den Fehler verursacht wurde.

+0

Funktioniert nicht mit meinen Gleitkommawerten im aktuellen Programm TypeError: 'numpy.float64' Objekt kann nicht aufgerufen werden – Enzy

0

Das Problem Array bei der Verwendung in range

In diesem Fall Sie Länge des Arrays Code Sie vereinfachen kann range(len(test_prediction))

auch nutzen sollten:

import operator 
#... 
enum_predict = enumerate(test_prediction) 
res = max(enum_predict, key=operator.itemgetter(1))[0] 

enumerate convert Array Liste von Tupeln (Index, Artikel)

key=operator.itemgetter(1) - max Funktion vergleicht Typen von seco nd wert

+0

Funktioniert nicht mit meinen Gleitkommawerten im aktuellen Programm TypeError: ('' numpy.float64 'Objekt ist nicht aufrufbar ", 'trat bei Index 0' auf – Enzy

0

kam ich mit einer anderen Lösung:

for i in range(3): 
    if np.take(test_prediction, i) > max: 
     max = np.take(test_prediction, i) 
     res = i 
if res==0: 
..... 

Dies funktioniert durch den Index in test_prediction Zugriff np.take

Aber die Lösung angegeben unter Verwendung von @Vivek_Kumar scheint mehr richtig und effizient.

Verwandte Themen