2016-07-12 11 views
2

Verzeihen Sie meine Terminologie, ich bin kein ML Pro. Ich könnte die falschen Begriffe unten verwenden.Wie führt man multivariable lineare Regression mit scikit-learn durch?

Ich versuche, multivariable lineare Regression durchzuführen. Nehmen wir an, ich versuche, das Geschlecht der Nutzer herauszufinden, indem ich die Seitenaufrufe auf einer Website analysiere.

Für jeden Benutzer, dessen Geschlecht ich weiß, ich habe eine Feature-Matrix, wobei jede Zeile einen Abschnitt Website repräsentiert, und das zweite Element, ob sie es besuchen, zum Beispiel:

male1 = [ 
    [1, 1],  # visited section 1 
    [2, 0],  # didn't visit section 2 
    [3, 1],  # visited section 3, etc 
    [4, 0] 
] 

So in scikit, ich bin Gebäude xs und ys. Ich bin als 1 ein männliches darstellen, und weibliche als 0

Die oben würde wie folgt dargestellt werden:

features = male1 
gender = 1 

Nun, ich bin natürlich nicht nur für einen einzelnen Benutzer ein Modell der Ausbildung, sondern Ich habe Zehntausende von Benutzern, deren Daten ich für das Training verwende.

Ich hätte gedacht, ich sollte meine xs und ys wie folgt erstellen:

xs = [ 
    [   # user1 
     [1, 1],  
     [2, 0],  
     [3, 1],  
     [4, 0] 
    ], 
    [   # user2 
     [1, 0],  
     [2, 1],  
     [3, 1],  
     [4, 0] 
    ], 
    ... 
] 

ys = [1, 0, ...] 

scikit das nicht mag:

from sklearn import linear_model 

clf = linear_model.LinearRegression() 
clf.fit(xs, ys) 

Es klagt:

ValueError: Found array with dim 3. Estimator expected <= 2. 

Wie soll ich dem linearen Regressionsalgorithmus eine Merkmalsmatrix liefern scikit lernen?

Antwort

3

Sie müssen xs auf andere Weise erstellen. Nach dem docs:

fit(X, y, sample_weight=None) 

Parameter:

X : numpy array or sparse matrix of shape [n_samples, n_features] 
     Training data 
    y : numpy array of shape [n_samples, n_targets] 
     Target values 
    sample_weight : numpy array of shape [n_samples] 
     Individual weights for each sample 

Daher xs mit so viele Zeilen wie Benutzer und so viele Spalten wie Web-Site Abschnitte ein 2D-Array sein sollte. Sie haben xs als 3D-Array definiert. Um die Anzahl der Dimensionen durch eine reduzieren Sie die Beseitigung der Abschnittsnummern durch eine Liste Verständnis bekommen können:

xs = [[visit for section, visit in user] for user in xs] 

Wenn Sie dies tun, werden die Daten, die Sie als ein Beispiel bereitgestellt umgewandelt in:

xs = [[1, 0, 1, 0], # user1 
     [0, 1, 1, 0], # user2 
     ... 
     ] 

und clf.fit(xs, ys) sollte wie erwartet funktionieren.

Eine effizientere Ansatz zur Dimensionsreduktion wäre, dass ein NumPy Array des Schneidens:

import numpy as np 
xs = np.asarray(xs)[:,:,1]