2017-10-04 1 views
0

J'essaye d'employer SVM mais je ne sais pas comment adapter le modèle quand j'emploie la trame de données de pandas. Si mes données ressemble à ceci:Ajustement SVM classifier de sklearn avec des données d'un pandas DataFrame

df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]}) 
df.x.apply(lambda x: np.array(list(map(int,x)))) 
>>>df 
    x   y 
0 [0, 1, 1] 0 
1 [1, 0, 0] 1 
2 [1, 1, 1] 0 

Si je tente d'ajuster le modèle de cette façon:

clf = svm.SVC().fit(df.x, df.y) 

Je reçois cette erreur:

ValueError: setting an array element with a sequence. 

Quelle est la bonne façon adapter le SVM en utilisant ce cadre de données?

Répondre

5
df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]}) 
df.x = df.x.apply(lambda x: list(map(int,x))) 

df 
      x y 
0 [0, 1, 1] 0 
1 [1, 0, 0] 1 
2 [1, 1, 1] 0 

df.x est une colonne de tableaux. Ce n'est probablement pas la meilleure façon de stocker des données, et il semblerait que sklearn ne soit pas très bon pour le comprendre. Il serait plus simple de tout convertir en une liste de listes et de passer que à SVC. Essayez ceci:

x = df.x.tolist() 
print(x) 
[[0, 1, 1], [1, 0, 0], [1, 1, 1]] 
SVC().fit(x, df.y) 
+0

Cela a beaucoup fonctionné, mais pouvons-nous utiliser un tableau numpy plutôt qu'une liste de liste. Parce que quand nous avons un grand ensemble de données, le tableau numpy est beaucoup plus rapide que la liste de la liste? – Ali

+1

@Ali Sklearn est merveilleux. Passer une liste ou un tableau numpy à sklearn ne fait aucune différence. –

+0

merci pour l'explication – Ali

2

Une autre solution est le code ci-dessous.

import pandas as pd 
import numpy as np 

from sklearn.svm import SVC 

df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]}) 
x = df.x.apply(lambda x: pd.Series(list(x))) 
x 
# Out[2]: 
# 0 1 2 
# 0 0 1 1 
# 1 1 0 0 
# 2 1 1 1 

SVC().fit(x, df.y) 
# Out[3]: 
# SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
# decision_function_shape=None, degree=3, gamma='auto', kernel='rbf', 
# max_iter=-1, probability=False, random_state=None, shrinking=True, 
# tol=0.001, verbose=False) 
+0

Oui, c'est une autre alternative que j'ai mentionnée dans les commentaires, mais j'ai négligé de répondre en guise de réponse. +1 –