2017-09-30 1 views
0

J'écris un script très simple. Tout ce que j'ai à faire est de lire les données en utilisant panda et ensuite former un arbre de décision sur les données. Les données que j'utilise est:ValueError: impossible de convertir la chaîne en float: med

https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data 

Et suivant est mon script

import numpy as np 
from sklearn.cross_validation import train_test_split 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.metrics import accuracy_score 
from sklearn import tree 
from sklearn import preprocessing 
import pandas as pd 
balance_data=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data", 
          sep= ',', header= None) 
#print "Dataset:: " 

#df1.head() 

X = balance_data.values[:, 0:5] 
Y = balance_data.values[:,6] 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 100) 
clf_gini = DecisionTreeClassifier(criterion = "gini", random_state = 100, 
           max_depth=3, min_samples_leaf=5) 

clf_gini.fit(X_train, y_train) 

De l'erreur je suppose qu'il n'a pas pu convertir « med » valeur d'attribut à flotter. Et en regardant les données, ma supposition aléatoire est que le bas a un espace avant lui et med ne le fait pas. C'est pourquoi cela devient confus. Mais je ne suis pas sûr de cela. S'il vous plaît dites ce qui pourrait être mauvais avec cela. PS: erreur se produit à la dernière ligne et le retraçage

ValueError        Traceback (most recent call last) 
<ipython-input-26-b495e5f26174> in <module>() 
    18        max_depth=3, min_samples_leaf=5) 
    19 X_train[X_train != ''] 
---> 20 clf_gini.fit(X_train, y_train) 

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted) 
    788    sample_weight=sample_weight, 
    789    check_input=check_input, 
--> 790    X_idx_sorted=X_idx_sorted) 
    791   return self 
    792 

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/tree/tree.pyc in fit(self, X, y, sample_weight, check_input, X_idx_sorted) 
    114   random_state = check_random_state(self.random_state) 
    115   if check_input: 
--> 116    X = check_array(X, dtype=DTYPE, accept_sparse="csc") 
    117    y = check_array(y, ensure_2d=False, dtype=None) 
    118    if issparse(X): 

/home/fatima/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.pyc in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator) 
    400          force_all_finite) 
    401  else: 
--> 402   array = np.array(array, dtype=dtype, order=order, copy=copy) 
    403 
    404   if ensure_2d: 

ValueError: could not convert string to float: med 

Répondre

1

L'ensemble de données ressemble à ceci:

 0  1 2 3  4  5  6 
0 vhigh vhigh 2 2 small low unacc 
1 vhigh vhigh 2 2 small med unacc 
2 vhigh vhigh 2 2 small high unacc 
3 vhigh vhigh 2 2 med low unacc 
4 vhigh vhigh 2 2 med med unacc 

Lorsque les types de données (dtypes) sont les suivants tous les objets. Cependant, les algorithmes d'apprentissage automatique ne peuvent apprendre qu'à partir de nombres (int, float, double ..). Vous devez donc encoder vos données avant de les utiliser pour la formation.

Il y a plusieurs façons d'encoder vos données, d'une façon est d'utiliser label encoding, pour ce faire, ajoutez les lignes suivantes à votre code juste après le chargement du jeu de données:

le = preprocessing.LabelEncoder() 
balance_data = balance_data.apply(le.fit_transform) 

Maintenant, les données balance_data regards comme ceci:

0 1 2 3 4 5 6 
0 3 3 0 0 2 1 2 
1 3 3 0 0 2 2 2 
2 3 3 0 0 2 0 2 
3 3 3 0 0 1 1 2 
4 3 3 0 0 1 2 2 

où tous les types de données sont int.

En général, vous devez effectuer un prétraitement des données avant d'entraîner votre modèle. Pour cela, je vous recommande de suivre un tutoriel pour comprendre le processus. Par exemple, vérifier:


Votre code général regardera ceci:

import numpy as np 
from sklearn.cross_validation import train_test_split 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.metrics import accuracy_score 
from sklearn import tree 
from sklearn import preprocessing 
import pandas as pd 
balance_data=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data", 
          sep= ',', header= None) 
#print "Dataset:: " 

#df1.head() 

le = preprocessing.LabelEncoder() 
balance_data = balance_data.apply(le.fit_transform) 

X = balance_data.values[:, 0:5] 
Y = balance_data.values[:,6] 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 100) 
clf_gini = DecisionTreeClassifier(criterion = "gini", random_state = 100, 
           max_depth=3, min_samples_leaf=5) 

clf_gini.fit(X_train, y_train) 
+0

Merci un groupe :) Je tentais d'utiliser LabelEncoder() mais didn ne sais pas comment l'utiliser –

+0

@HannahMontanna vous êtes les bienvenus :), recherchez le tutoriel auquel je suis lié, pour acquérir une certaine expérience autour du prétraitement des données .. – MedAli

0

J'ai vérifié le fichier ici, vous essayez de traiter, et je trouve ce sont les données:

vhigh,vhigh,2,2,small,med,unacc 
vhigh,vhigh,2,2,small,high,unacc 
vhigh,vhigh,2,2,med,low,unacc 
vhigh,vhigh,2,2,med,med,unacc 
vhigh,vhigh,2,2,med,high,unacc 

Alors Lorsque vous demandez à former le modèle, en interne tente de convertir votre vecteur en nombres, mais trouve des valeurs de chaînes (comme "petit", "med", "haut", etc) qui ne sont pas analysables à un nombre.

Un bon début pourrait être de normaliser vos valeurs catégorielles en codage Onehot. Vérifiez ici:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html