Decision Tree für nicht numerische Daten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Leny
User
Beiträge: 16
Registriert: Freitag 26. Mai 2017, 19:34

Hallo,

ich bin erst der Anfänger in Python und habe wahrscheinlich ein triviales Problem. Beim einlesen eine CSV-Datei mit Pandas übergebe ich mit dem Parameter dtype die Datentypen für die Spalten. Bei Ausführen des Codes kriege ich diese Fehlermeldung:
"ValueError: could not convert string to float: 'x_grid'."
Ich habe schon diverse Foren durchgelesen und habe leide keine Lösung gefunden. Habt ihr vielleicht eine Idee, was ich anderes machen soll?

Vielen Dank im Voraus.

Code: Alles auswählen

# -*- coding: utf-8 -*-

from sklearn import tree
import pandas as pd
import numpy as np


names=['Category','Hour','Minutes','Seconds','Yaer','Month','Day','x_grid', 'y_grid']
crimeDataSet = pd.read_csv('crimeDataSet.csv', sep=';', names=names, dtype={'x_grid':np.float64, 'y_grid':np.float64})
Zuletzt geändert von Anonymous am Samstag 10. Juni 2017, 20:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Leny: Was nicht in eine Gleitkommazahl umgewandelt werden kann ist laut Ausnahme die Zeichenkette 'x_grid'. Wenn ich mal raten müsste, dann stehen in der ersten Zeile der CSV-Datei keine Daten sondern die Spaltenüberschriften. Die darfst Du dann nicht mit einlesen. Schau Dir die Dokumentation zur `read_csv()`-Funktion noch einmal gründlich an, was man da anders machen könnte/müsste.
Leny
User
Beiträge: 16
Registriert: Freitag 26. Mai 2017, 19:34

Hallo,

Danke für den Hinweis @BlackJack, ich habe mir Doku noch mal angeschaut, da steht ja mit dem Parameter names übergibt man die Namen der Spalten, die man auch später nutzen kann (names : array-like, default None List of column names to use.). Dies habe ich ja auch in dtype gemacht. Verstehe ich den Satz falsch?

Die explizite Zuweisung der Datentypen, habe ich aus dem Grund gemacht, dass die Datentypen vom Dataframe nicht automatisch erkannt wurden. Bei der Datentypabfrage durch Dataframe.dtype kam nur Object raus.
Mittlerweile (warum auch immer) werden die Datentypen richtig erkannt. Dabei habe ich Probleme mit der Visualisierung:
1. Obwohl ich GraphViz über pip installiert habe, kommt folgende Fehlermeldung: GraphViz's executables not found. Ich habe bereits den Pfad bei der Umgebungsvariable definiert, leider kein Erfolg.
2. Ich habe einen relativ großen Datensatz für den ich decision tree aufbaue und dann visualisieren möchte. Nun stürzt mein Python mit dem memory error ab. Ich habe nicht verstehen warum ich mach es ja über die Dot-Datei. d.h. alle Berechnungen wurde bereits vorgenommen und es muss nur eine schöne Grafik gebaut werden. Liege ich da falsch?

vielen Danke für eure Hilfe im Voraus.

Code: Alles auswählen

# -*- coding: utf-8 -*-

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
import sklearn.metrics
[b]#Load the dataset[/b]
header=['Hour','Year','Month','Day','x_grid', 'y_grid','Category']
myData=pd.read_csv('crimeDataSet.csv', sep=';')


data_clean=myData.dropna()
print (data_clean.dtypes)
print(data_clean.describe())

predictors=data_clean[['Hour','Year','Month','Day','x_grid', 'y_grid']]
targets=data_clean.Category

pred_train, pred_test, tar_train,tar_test=train_test_split(predictors, targets, test_size=.4)

print(pred_train.shape)
print(pred_test.shape)
print(tar_train.shape)
print(tar_test.shape)
[b]
#Build a model on training data[/b]

classifier= DecisionTreeClassifier()
classifier= classifier.fit(pred_train,tar_train)

predictions=classifier.predict(pred_test)
print(sklearn.metrics.confusion_matrix(tar_test,predictions))
print(sklearn.metrics.accuracy_score(tar_test,predictions))


[b]#Display a decision tree[/b]
from sklearn import tree
from io import StringIO
from IPython.display import Image 
import pydotplus
dot_data=StringIO()
tree.export_graphviz(classifier,out_file=dot_data)
graph=pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.creat_png())
print('fertig')
Zuletzt geändert von Anonymous am Dienstag 13. Juni 2017, 22:04, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Leny: Ad 1. Mit ``pip`` wirst Du nur das Python-Modul installiert haben. GraphViz ist eine Sammlung von Kommandozeilenprogrammen, die muss man extra installieren.

Ad 2. Es werden insgesamt wohl einfach zu viele Daten sein, die nicht alle in den Speicher passen. Ich würde das als erstes mal nicht alles auf Modulebene passieren lassen, sondern die einzelnen Arbeitsschritte in Funktionen schreiben, damit nach Abarbeitung jedes Schritts die Zwischenergebnisse die nur lokal in den Funktionen existieren nicht mehr im Speicher liegen. Falls das nicht ausreicht würde ich als nächstes die DOT-Datei tatsächlich als externe Datei anlegen und nicht die Daten im Arbeitsspeicher halten.

Importe werden übrigens üblicherweise alle am Anfang des Moduls geschrieben, damit man leichter sieht was für Abhängigkeiten ein Modul hat. Da scheinen auch welche dabei zu sein, die gar nicht verwendet werden.
Leny
User
Beiträge: 16
Registriert: Freitag 26. Mai 2017, 19:34

Danke @BlackJack ich probiere deine Tipps aus)
Antworten