2016-06-07 2 views
0

Я пытаюсь создать простое дерево решений, но я продолжаю получать тот же ValueError, и ни одна из подобных угроз не имела никакой помощи. Ни одна из моих переменных не является строкой, но все же я получаю ошибку при преобразовании.Python - ValueError: не удалось преобразовать строку в float:

from pandas import Series, DataFrame 
import pandas as pd 
import numpy as np 
import os 
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 

os.chdir("C:\Mlearning") 

""" 
Data Engineering and Analysis 
""" 
#Load the dataset 

AH_data = pd.read_csv("gapminder.csv") 

data_clean = AH_data.dropna() 

#data_clean.dtypes 
#data_clean.describe() 


""" 
Modeling and Prediction 
""" 
#Split into training and testing sets 

predictors = data_clean[['breastcancerper100th','alcconsumption']] 

targets = data_clean.employrate 

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

pred_train.shape 
pred_test.shape 
tar_train.shape 
tar_test.shape 

#Build model on training data 
classifier=DecisionTreeClassifier() 
classifier=classifier.fit(pred_train,tar_train) 

predictions=classifier.predict(pred_test) 

sklearn.metrics.confusion_matrix(tar_test,predictions) 
sklearn.metrics.accuracy_score(tar_test, predictions) 

#Displaying the decision tree 
from sklearn import tree 
#from StringIO import StringIO 
from io import StringIO 
#from StringIO import StringIO 
from IPython.display import Image 
out = StringIO() 
tree.export_graphviz(classifier, out_file=out) 
import pydotplus 
graph=pydotplus.graph_from_dot_data(out.getvalue()) 
graph.write_pdf("graph.pdf") 

Но результат, который я получаю это один:

array = np.array(array, dtype=dtype, order=order, copy=copy) 

ValueError: could not convert string to float: 
+1

Это ошибка в вашем 'classifier.fit'? или где-то еще? Можете ли вы опубликовать образец данных, которые вы пытаетесь классифицировать? – pekapa

+0

Можете ли вы изменить свой вопрос, чтобы показать полную трассировку? Вывод 'data_clean.dtypes' тоже был бы полезен (и, возможно,' data_clean.head() ', если вы можете поделиться им). –

+0

Мне кажется, что вы пытаетесь предсказать значение с плавающей точкой (уровень занятости). Это проблема регрессии, а не проблема классификации. Вместо этого попробуйте использовать «DecisionTreeRegressor». Мы сможем помочь намного лучше, если вы разместите трассировку, чтобы мы могли видеть, из какой строки вызывается «ValueError». –

ответ

0

Это, скорее всего, проблема с данными. Поскольку у вас нет какой-либо точки в коде, в котором вы пытаетесь преобразовать в float, должно быть, что данные, которые у вас есть, находятся в форме, которая препятствует тому, чтобы ваши данные были прочитаны как число с помощью ваших команд синтаксического анализа.

1

Вы можете использовать pd.to_numeric (представленный в версии 0.17) для преобразования столбца или серии в числовой тип. Эта функция также может применяться к нескольким столбцам DataFrame с использованием apply.

Важно отметить, что функция также принимает аргумент ключевого слова ошибок, который позволяет принудительно вводить числовые значения в NaN или просто игнорировать столбцы, содержащие эти значения.

Будет работать, если вы преобразуете все записи в числовые. Я использую для этого небольшую функцию:

def convert_column_numeric(ax): 
    predictors[ax] = pd.to_numeric(predictors[ax], errors='coerce') 

..... 

convert_column_numeric('breastcancerper100th') 
convert_column_numeric('alcconsumption')`