Wie erhöhe ich die Richtigkeit meiner Linearen Regressionsmodell?(maschinelles lernen mit python)
Ich habe eine machine-learning-Projekt mit python mithilfe von scikit-learn Bibliothek. Ich habe zwei getrennte Datensätze für die Ausbildung und Prüfung, und ich versuche zu tun, die lineare regression. Ich verwenden Sie diesen codeblock unten gezeigt:
import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt
from pylab import rcParams
import urllib
import sklearn
from sklearn.linear_model import LinearRegression
df =pd.read_csv("TrainingData.csv")
df2=pd.read_csv("TestingData.csv")
df['Development_platform']= ["".join("%03d" % ord(c) for c in s) for s in df['Development_platform']]
df['Language_Type']= ["".join("%03d" % ord(c) for c in s) for s in df['Language_Type']]
df2['Development_platform']= ["".join("%03d" % ord(c) for c in s) for s in df2['Development_platform']]
df2['Language_Type']= ["".join("%03d" % ord(c) for c in s) for s in df2['Language_Type']]
X_train = df[['AFP','Development_platform','Language_Type','Resource_Level']]
Y_train = df['Effort']
X_test=df2[['AFP','Development_platform','Language_Type','Resource_Level']]
Y_test=df2['Effort']
lr = LinearRegression().fit(X_train, Y_train)
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
print("Training set score: {:.2f}".format(lr.score(X_train, Y_train)))
print("Test set score: {:.7f}".format(lr.score(X_test, Y_test)))
Meine Ergebnisse sind:
lr.coef_: [ 2.32088001 e+00 2.07441948 e-12 -4.73338567 e-05 6.79658129 e+02]
lr.intercept_: 2166.186033098048
Trainings-set Punktzahl: 0.63
Test-set Punktzahl: 0.5732999
Was empfehlen Sie mir? Wie kann ich meine Genauigkeit erhöhen? (hinzufügen von code,parameter etc.)
Meine Datensätze ist hier: https://yadi.sk/d/JJmhzfj-3QCV4V
- Verwenden Regularisierung. Davon abgesehen: es ist zu breit und hängt immer von den Daten, was nicht gegeben ist!
- Wenn Sie die csv-Dateien die Menschen geben könnte, konkrete Verbesserungen.
- Ich fügte hinzu, datasets
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich erarbeiten ein wenig auf @GeorgiKaradjov Antwort mit einigen Beispielen. Ihre Frage ist sehr breit, und es gibt mehrere Möglichkeiten, um Verbesserungen. Am Ende, mit domain-wissen (Kontext) geben Ihnen die bestmögliche chance auf Verbesserungen.
1) Normalisierung der Daten
Gibt
2) Kategorische Feature Codierung
Gibt
3) Feature Engineering; Kollinearität
Du willst die rote Linie für
y=x
da die Werte sollten korreliert sein mit sich. Aber keine roten oder blauen Säulen zeigen eine starke Korrelation/anti-Korrelation, erfordert eine genauere Untersuchung. Zum Beispiel, Ressource=1, Resource=4, könnte eine hohe Korrelation in dem Sinne, wenn Menschen 1 es gibt eine geringere chance zu haben, 4 usw. Regression wird davon ausgegangen, dass die verwendeten Parameter sind von einander unabhängig.3) Feature engineering, höhere Reihenfolge Begriffe
Vielleicht ist dein Modell ist zu einfach, Sie könnte prüfen, indem höhere Bestell-und cross-Bedingungen:
Hatte ich einen schnellen Versuch an, ich glaube nicht, dass die höhere Reihenfolge Begriffe helfen viel. Es ist auch möglich Ihre Daten nicht-lineare, eine schnelle
logarithm
oder die Y-Ausgang gibt ein schlechter fit, was darauf hindeutet, es ist linear. Sie könnten auch einen Blick auf den aktuellen Werten, aber ich war zu faul....4) Regularisierung
Versuchen Sie es mit sklearn ist RidgeRegressor und spielen mit alpha:
5) Alternative Modelle
Manchmal die lineare regression ist nicht immer geeignet. Zum Beispiel, Random Forest Regressoren kann ausführen sehr gut, und sind in der Regel unempfindlich gegen die Daten werden vereinheitlicht und als kategorischen/permanent. Andere Modelle verfügen über XGBoost, und Lasso (der Linearen regression mit L1-Regularisierung).
Setzen Sie alle zusammen
Ich wurde mitgerissen und begann, mich an Ihrem problem, konnte es aber nicht verbessern, ist es zu viel, ohne zu wissen, alle die Kontext-Funktionen:
Ergibt:
Kann man sich die Bedeutung der Variablen (je höher der Wert, desto wichtiger).
Könnten Sie beginnen, die hyperparameters um Verbesserungen auf diesem auch: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV
afp = np.append(X_train['AFP'].values, X_test['AFP'].values)
den scaler sieht sowohl für Zug-und test-Daten. Sollte es nicht nur auf die X_train?hier sind einige Tipps :
Aufbereitung der Daten(exploration) ist einer der wichtigsten Schritte in einem machine-learning-Projekt, die Sie brauchen, damit zu beginnen.
hast du sauber deine Daten? wenn nicht, beginnen Sie mit Schritt!
Wie gesagt in dieses tutorial :
hier ist eine Schritt für data exploration :
fehlenden Werten Behandlung,
Ausreißer entfernen
feature engineering
Danach versuchen zu führen univariate und bivariate Analyse mit Ihren Eigenschaften.
verwenden ein hot Kodierung, verwandeln Sie kategoriale Merkmale in die Numerik lieben.
dies ist, was Sie brauchen nach, worüber wir gesprochen haben in den Kommentaren.
hier ist ein tutorial zum Umgang mit kategorialen Variablen, one-hot-Codierung von sklearn lernen, ist die beste Technik für Ihr problem.
Mithilfe von ASCII-Darstellung ist nicht die beste Praxis für den Umgang kategorische Merkmale
Finden Sie weitere Informationen zur Daten-exploration in hier
befolgen Sie die Vorschläge, die ich Euch schenkte und mir später danken.