0

Ich bin neu zu lernen und Sklearn zum ersten Mal zu lernen. Ich habe zwei Datenrahmen, einen mit Daten zum Trainieren eines logistischen Regressionsmodells (mit 10-facher Kreuzvalidierung) und einen anderen zum Vorhersagen von Klassen ("0,1") unter Verwendung dieses Modells. Hier ist mein Code so weit Bits-Tutorials mich auf Sklearn docs und im Web gefunden:Logistische Regression sklearn - Zug und Anwendung Modell

import pandas as pd 
import numpy as np 
import sklearn 
from sklearn.linear_model import LogisticRegression 
from sklearn.model_selection import KFold 
from sklearn.preprocessing import normalize 
from sklearn.preprocessing import scale 
from sklearn.model_selection import cross_val_score 
from sklearn.model_selection import cross_val_predict 
from sklearn import metrics 


# Import dataframe with training data 
df = pd.read_csv('summary_44.csv') 
cols = df.columns.drop('num_class') # Data to use (num_class is the column with the classes) 

# Import dataframe with data to predict 
df_pred = pd.read_csv('new_predictions.csv') 

# Scores 
df_data = df.ix[:,:-1].values 

# Target 
df_target = df.ix[:,-1].values 

# Values to predict 
df_test = df_pred.ix[:,:-1].values 

# Scores' names 
df_data_names = cols.values 

# Scaling 
X, X_pred, y = scale(df_data), scale(df_test), df_target 

# Define number of folds 
kf = KFold(n_splits=10) 
kf.get_n_splits(X) # returns the number of splitting iterations in the cross-validator 

# Logistic regression normalizing variables 
LogReg = LogisticRegression() 

# 10-fold cross-validation 
scores = [LogReg.fit(X[train], y[train]).score(X[test], y[test]) for train, test in kf.split(X)] 
print scores 

# Predict new 
novel = LogReg.predict(X_pred) 

Ist dies der richtige Weg, um eine logistische Regression zu implementieren? Ich weiß, dass die fit() - Methode nach der Kreuzvalidierung verwendet werden sollte, um das Modell zu trainieren und es für Vorhersagen zu verwenden. Da ich jedoch fit() innerhalb eines Listenverständnisses aufgerufen habe, weiß ich wirklich nicht, ob mein Modell "angepasst" war und kann verwendet werden, um Vorhersagen zu treffen.

+0

Post einige Daten. df und df_data ausgeben – skrubber

Antwort

1

I allgemeine Dinge sind in Ordnung, aber es gibt einige Probleme.

  1. Skalierung

    X, X_pred, y = scale(df_data), scale(df_test), df_target 
    

Sie Skala Trainings- und Testdaten unabhängig, was nicht korrekt ist. Beide Datensätze müssen mit demselben Skalierer skaliert werden. "Scale" ist eine einfache Funktion, aber es ist besser, etwas anderes zu verwenden, zum Beispiel StandardScaler.

scaler = StandardScaler() 
scaler.fit(df_data) 
X = scaler.transform(df_data) 
X_pred = scaler.transform(df_test) 
  1. Kreuzvalidierung und die Vorhersage. Wie funktioniert Ihr Code? Sie teilen Daten 10 Mal in Zug und Hold-out-Set; 10-mal passendes Modell auf Zug gesetzt und Punktezahl auf Hold-Out-Set berechnen. Auf diese Weise erhalten Sie Kreuzvalidierungswerte, das Modell ist jedoch nur für einen Teil der Daten geeignet. So wäre es besser, Modell auf den gesamten Datensatz passen und dann eine Vorhersage machen:

    LogReg.fit(X, y) 
    novel = LogReg.predict(X_pred) 
    

Ich möchte bemerken, dass es vorwärts bewegt werden Techniken wie das Stapeln und die Förderung, aber wenn Sie sklearn lernen mit, dann Es ist besser, sich an die Grundlagen zu halten.

Verwandte Themen