2016-05-12 4 views
3

Also mache ich eine Kaggle-Wettbewerb und die Größe der Testdatensatz es 880.000 Zeilen lang. Und ich möchte einen zufälligen Forest-Klassifikator auf 10.000 Zeilen davon anwenden. Aber wenden Sie es immer noch auf alles an.
Hier ist, wie mein Klassifizierer eingerichtet istWie man einen randomforest Klassifikator auf den gesamten Datensatz anwenden, einen kleinen Abschnitt nach dem anderen in Python

from sklearn.ensemble import RandomForestClassifier 

clf = RandomForestClassifier(n_estimators=100) 
# Training data features, skip the first column 'Crime Category' 
train_features = train[:, 1:] 

# 'Crime Category' column values 
train_target = train[:, 0] 

clf = clf.fit(train_features, train_target) 
score = clf.score(train_features, train_target) 
"Mean accuracy of Random Forest: {0}".format(score) 

ich verwendet, um dieses mein Modell zu trainieren und die Genauigkeit zu erhalten. Ich habe die Trainingsdaten kleiner gemacht, damit ich schneller Ergebnisse erzielen konnte. Aber damit ich mich Kaggle unterwerfen kann, muss ich die Testdaten vorhersagen. Grundsätzlich möchte ich dies tun:

test_x = testing_data[:, 1:] 
print('-',*38) 
for every 10,000 rows in test_x 
    test_ y = clf.predict(value) 
    print(".") 
    add the values to an array then do the next 10,000 rows 

Auf 10.000 Zeilen ich die Werte vorhersagen wollen, fügen Sie die vorhergesagten Werte irgendwo dann die nächsten 10.000 Zeilen tun. Wenn ich alle 880.000 Zeilen gleichzeitig drücke, erstarrt mein Computer. Ich hoffe, dass ich, indem ich 10.000 Reihen gleichzeitig mache und den Druck (".") Benutze, einen Fortschrittsbalken bekomme. Ich änderte die test.csv von pandasdataframe zu values unter Verwendung der test= test.values.

Ich habe so viele Informationen wie möglich aufgenommen, wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.

Antwort

1

Mit pd.DataFrame können Sie über Stücke der index und concat die Ergebnisse iterieren einen neuen DataFrame verwenden. Verwenden Sie für np.arraynp.array_split.

def chunks(l, n): 
    """ Yield successive n-sized chunks from l.""" 
    for i in range(0, len(l), n): 
     yield l[i:i + n] 

test_x = pd.DataFrame(test_x) 
test_result = pd.DataFrame() 
for chunk in chunks(test_x.index, 10000): 
    test_data = test_x.ix[chunk] 
    test_result = pd.concat([test_result, pd.DataFrame(clf.predict(test_data))]) 
+0

es in einem Attribute gibt: ‚numpy.ndarray‘ Objekt kein Attribut ‚Index‘ hat, weil die test_x ein numpy.ndarray ist. – Zander

+0

Sieht so aus, als ob Sie 'numpy arrays' verwenden, nicht Pandas' DataFrames'. Sie haben die Wahl, einen zu erstellen, indem Sie 'test_x = DataFrame (test_x)' verwenden oder für 'numpy' schreiben müssen, zum Beispiel mit 'np.array_split'. – Stefan

+0

Ich landete meine test_x zurück zu einem Pandas dann bekam ich diesen Fehler 'kann nicht ein NDFrame-Objekt verketten' @Stefan Jansen – Zander

0

Ich mache die Annahme, Ihr Index sequenziellen ganzen Zahlen ...

groups = test_x.groupby(test_x.index // 10000) 
groups.apply(clf.predict) 

Wenn der Index nicht sequenziellen ganzen Zahlen ist dies eine Möglichkeit ist ...

groups = test.groupby(test.reset_index().index // 10000) 

Heresa vollständiges Beispiel ...

from sklearn.datasets import load_iris 
from sklearn.ensemble import RandomForestClassifier 
import pandas as pd 
import numpy as np 

iris = load_iris() 
df = pd.DataFrame(iris.data, columns=iris.feature_names) 

train, test = (df[:100], df[100:]) 
y_train, y_test = (iris.target[:100], iris.target[100:]) 

clf = RandomForestClassifier() 
clf.fit(train, y_train) 

groups = test.groupby(test.index // 10) 
groups.apply(clf.predict) 

Ausgabe ist eine Pandas Reihe von Listen von Prognosen ...

10 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
11 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
12 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
13 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
14 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
Verwandte Themen