2017-11-17 3 views
-1

Ich bin neu in Machine Learning und Sklearn. Also, ich habe die folgende Frage:Wie kann ich meine eigenen Daten in sklearn verwenden - Python3

Ich versuche, eine lineare Regression zu tun, aber ich möchte meine eigenen Daten aus einigen .txt Datei verwenden. Ich habe einige Daten mit einer Tabelle mit 3 Spalten.

Dann würde Ich mag wissen, wie kann ich diesen folgenden Code zu ändern, dass ein Beispiel aus http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html

Dann änderte ich ein bisschen den Code in dem Beispiel vor und erfand ich einige Daten, ist, dass eine korrekte Weg, es zu tun? Verwenden Sie so etwas wie X und Y. Und dann würde ich auch wissen, wie in der Gleichung: x_train = x [:2], hat die [:2] etwas Einfluss auf meine Vorgehensweise. Ich habe diesen Teil nicht wirklich bekommen.

from sklearn import linear_model 
import matplotlib.pyplot as plt 
from sklearn.metrics import mean_squared_error, r2_score 

#X has to be numpy array not list. 

x=([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]) 
y=[5,3,8,3,4,5,5,7,8,9,10] 

x_train = x [:2] 
x_test = x [2:] 

y_train = y[:2] 
y_test = y[2:] 

regr = linear_model.LinearRegression() 
regr.fit (x_train,y_train) 

y_pred = regr.predict(x_test) 

#coefficient 
print('Coefficients: \n', regr.coef_) 

#the mean square error 
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred)) 
print('Variance score: %.2f' % r2_score(y_test, y_pred)) 

plt.scatter(x_test, y_test, color='black') 
plt.plot(x_test, y_pred, color='blue', linewidth=3) 
plt.axis([0, 20, 0, 20]) 
plt.show() 

Vielen Dank!

EDIT 1

Mit Hilfe mich auf dieser Webseite erhalten hat, habe ich versucht, einen Code zu machen, einen Anfall meiner eigenen Daten zu erzeugen, aber ich bin nicht in der Lage, die richtige Passform zu erhalten, so wenn jemand Zeit hat, mir ein bisschen mehr zu helfen oder mir zu sagen, wenn ich etwas falsch mache.

Der Code, den ich mit den Bildern verwende ich bin immer

import pandas as pd 
import numpy as np 
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_score 
from sklearn import linear_model 
from sklearn.metrics import mean_squared_error, r2_score 
import matplotlib.pyplot as plt 

data = pd.read_csv('data.txt') 
#x = data[['col1','col2']] 
x = data[['col1']] 
y = data['col3'] 

#convert to array to fit the model 
x=np.asarray(x) 
y=np.asarray(y) 

# define the KFolds 
kf = KFold(n_splits=2) 

#define the model 
regr = linear_model.LinearRegression() 

# use cross validation and return the r2 score for each Fold 
#if you want to return other scores than r2, just change the scoring in cross_val_score 
scores = cross_val_score(regr, x, y, cv= kf, scoring= 'r2') 

print(scores) 

for train_index, test_index in kf.split(x): 
    print("TRAIN:", train_index, "TEST:", test_index) 
    X_train, X_test = x[train_index], x[test_index] 
    y_train, y_test = y[train_index], y[test_index] 


plt.scatter (X_test, y_test) 
plt.show() 

ich hier setzen ein Bild von dem, was aussieht wie meine Daten und was ich von ZUG UND TEST erhalten First part of the code

dann habe ich einige die Anpassungsprozedur, aber ich bin nicht sicher, ob es korrekt ist:

regr.fit (X_train, y_train) 
y_pred = regr.predict(X_test) 
print(y_pred) 
plt.scatter(X_test, y_test, color='black') 
plt.plot(X_test, y_pred, color='blue', linewidth=3) 
plt.show() 

Und ich bekomme eine völlig fremde Passform. Fit of my function

Ich verstehe nicht, warum ich es bekomme, wenn wenn ich dies mit MINUIT tat, meine Passform funktionierte. Also, wenn jemand ein paar Tipps hat, um mir zu helfen.

Warum scheint das Programm nicht meine Daten von "y" zu benutzen, um TRAIN- oder TEST-Proben zu machen?

können Meine Daten hier taked werden: https://www.dropbox.com/sh/nbbsc0fqznkwxvt/AAD-u6lM4orJOGrgIyz0o8B9a?dl=0 Für mich

die einzige wichtig ist col1 und col3 sollten die col2 ignoriert werden. Dann möchte ich in diese Daten passen und den Wert meiner Passform extrahieren. Ich weiß, dass es eine Zeile ist, die zu diesen Daten passt.

Vielen Dank!

+0

Dies ist zu breit einsetzbar und einfach ohne eigene Versuche der anderen Code zeigt. Lesen Sie die Dokumentation, um die benötigten Datenformen zu verstehen. Überprüfen Sie dies, indem Sie '' diabetes_X.shape''' und co ausdrucken. Dann lies numpy oder pandas docs, um mehr über das Lesen von Daten in numplige Arrays/Datenrahmen zu erfahren. (es hängt von Ihrer txt-Datei ab, die nicht angegeben ist; weiter ist Ihre Beschreibung über diese Datei informell) – sascha

+0

@sascha Ich habe im Internet nach dem gesucht. Ich konnte keine Erklärung finden, um zu verstehen, wie ich meine eigenen Daten in einer linearen Regression verwenden kann. Alle Beispiele verwenden einen Datensatz, der nicht von der eigenen Person stammt. Ich kann meine Datensätze hier nicht bereitstellen. Es sind keine öffentlichen Informationen. Ich habe nur eine TXT-Datei mit 3 Spalten über einige Messungen. Sie können einen Link anbieten, wo ich eine Erklärung finden kann, wie ich mein eigenes Dataset hochladen kann. Ihre Antwort ist überhaupt nicht hilfreich. Aber trotzdem danke! – Gabriela

+0

** Alles was du brauchst ** ist in der Dokumentation enthalten! sklearn's für die benötigten Formen. Dann müssen Sie nur Arrays mit den richtigen Formen erstellen. Wie du es machst ist egal. Numpy und Pandas bieten beide Lesern. Seien Sie darauf gefasst, dass diese Frage geschlossen wird, wenn Sie keine hilfreichen Informationen zur Verfügung stellen (die gegebene Antwort erwähnt einen Ansatz)! (Es gibt unendlich viele verschiedene Kodierungen von textbasierten 3-Spalten-Datensätzen!) – sascha

Antwort

1

Der Hauptgrund, warum Sie die Daten teilen und einen Teil der Daten verwenden möchten, um das Modell und einen anderen Teil zu trainieren, um es zu trainieren, besteht darin, Überanpassungen zu vermeiden. Normalerweise verwenden wir KFolds oder LOO (lassen Sie eins aus), um Kreuzvalidierung durchzuführen.

Hier ist ein Beispiel mit 30 Proben, 3 Variablen und Kreuzvalidierung mit KFolds.

import numpy as np 
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_score 
from sklearn import linear_model 

#create artificial data with 30 lines (samples) and 3 columns (variables) 
x = np.random.rand(30,3) 

#create the target variable y 
y = range(30) 

# convert the list to numpy array (this is needed for fit method of sklearn) 
y = np.asarray(y) 

# define the KFolds (3 folds in this example) 
kf = KFold(n_splits=3) 

#define the model 
regr = linear_model.LinearRegression() 

# use cross validation and return the r2 score for each Fold (here we have 3). 
#if you want to return other scores than r2, just change the scoring in cross_val_score. 
scores = cross_val_score(regr, x, y, cv= kf, scoring= 'r2') 

print(scores) 

Ergebnisse:

Hier können Sie für jede Falte des r2-Score des Modells sehen. Also haben wir die Daten 3 mal geteilt und wir haben 3 verschiedene Trainingsdaten verwendet, um diese Werte zu erhalten. Dies wird automatisch von sklearn innerhalb der cross_val_score-Methode durchgeführt.

array([-30.36184326, -0.4149778 , -28.89110233]) 

Um zu verstehen, was KFold macht Sie die Trainings- und Test Indizes mit ausdrucken:

for train_index, test_index in kf.split(x): 
    print("TRAIN:", train_index, "TEST:", test_index) 
    X_train, X_test = x[train_index], x[test_index] 
    y_train, y_test = y[train_index], y[test_index] 

Ergebnisse:

('TRAIN:', array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 
    27, 28, 29]), 'TEST:', array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) 
('TRAIN:', array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 21, 22, 23, 24, 25, 26, 
    27, 28, 29]), 'TEST:', array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])) 
('TRAIN:', array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
    17, 18, 19]), 'TEST:', array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29])) 

Nun, Sie, dass für die sehen 1. Falten wir verwendeten die Proben: 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29.

Als nächstes werden für den zweiten Falz haben wir die Proben: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29.

Hinweis: Diese Zahlen sind die Indizes der x-Daten. Z.B. 2 bedeutet die 3. Probe (Linie). In Python zählen wir von 0. Wie Sie sehen, verwenden wir nicht genau die gleichen Daten (Beispiele) in jeder Faltung.

Hoffe, das hilft.

EDIT 1

Ihre Frage über das Laden der txt-Daten zu beantworten. Angenommen, Sie haben eine txt-Datei mit 3 Spalten. Die ersten beiden Spalten sind die Features und die letzte Spalte ist das y (Ziel).

In diesem Fall können Sie die folgenden mit Pandas tun:

import pandas as pd 
import numpy as np 

data = pd.read_csv('data.txt') 
x = data[['col1','col2']] 
y = data['col3'] 

#convert to array to fit the model 
x=np.asarray(x) 
y=np.asarray(y) 

Die txt ist hier: https://ufile.io/eb5xl (wählen langsam Download).

EDIT 2

Dies ist nur zur Visualisierung. Ich teile die Daten nicht auf. Ich benutze alle Daten, um das Modell anzupassen, und dann prognostiziere ich dieselben Daten. Dann zeichne ich die vorhergesagten Werte auf.

import pandas as pd 
import numpy as np 
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_predict 
from sklearn import linear_model 
import matplotlib.pyplot as plt 

data = pd.read_csv('data.txt') 

x = data[['col1']] 
y = data['col3'] 

#convert to array to fit the model 
x=np.asarray(x) 
y=np.asarray(y) 

regr = linear_model.LinearRegression() 
regr.fit(x, y) 

y_predicted = regr.predict(x) 

plt.scatter(x, y, color='black') 
plt.plot(x, y_predicted, color='blue', linewidth=3) 

plt.xticks(()) 
plt.yticks(()) 

plt.show() 

Ergebnisse:

Es scheint, dass die Daten ein lineares Muster folgen nicht. Andere Modelle sollen (zum Beispiel exponentiellen Fitting)

Linear regression

+0

Vielen Dank für Ihre Erklärung. Das hat sehr geholfen. Aber ich habe noch ein paar Fragen. Tut mir leid, wenn sie zu Basic sind, aber ich studiere dieses Thema selbst. Wie auch immer meine Fragen sind: Der Unterschied zwischen Ihrem Code und dem, den ich gepostet habe, war, dass in Ihrem Code scheint, dass der Computer allein die Trennung zwischen den Trainings und dem Test macht? Weil ich in meinem Code das Intervall schreiben sollte, das wir machen wollen. In Ihrem Beispiel ist KFOLD das richtig? Außerdem würde ich gerne wissen ob ich in das x schreiben kann, zum Beispiel eine Matrix mit 30 Zeilen und 3 Spalten mit meinen Daten? – Gabriela

+0

Und letzte Frage, ist das möglich in der Methode lineare Regression auch den Fehler definieren, die ich in meiner Variablen habe, um die Anpassung zu tun? Weil ich meinen eigenen Fehler habe, also wenn ich das dem Code informiere, kann die Passform genauer sein? Ich hoffe meine Fragen sind klar. Wenn nicht, kann ich umschreiben. Danke vielmals! – Gabriela

+0

@Gabriela für die erste Frage: Ja der Hauptunterschied ist, dass ich in meinem Code KFold verwende, um die Daten zu teilen. Für die zweite Frage: Ja, es ist sehr einfach. Sag mir einfach, welche Daten du hast. CSV-Datei oder Excel oder TXT? Für die letzte Frage: Das Modell berechnet den Fehler, ich denke, es sollte der gleiche sein wie der, den Sie haben. Wenn Sie Ihren Fehler verwenden und dem Modell zuführen möchten, müssen Sie selbst eine lineare Regressionsfunktion fest codieren. – sera

0

Wie wies darauf hin:

  • Zeige jemand anderem Code des auf Stack-Überlauf nicht gute Praxis ist. Bitte lesen Sie this darüber, wie Sie Fragen stellen können.
  • Sie sollten ein Beispiel für Ihre Daten angeben (oder Dummy-Daten, wenn Sie Ihre echten Daten nicht offenlegen können).

Wie auch immer, wenden Sie Textdatei in einem CSV, das heißt, eine Textdatei mit dieser Struktur:

col1name;col2name;col3name 
1;0;2 
4;6;8 
0;1;3 

Dann setzen Sie Ihre Datenmenge in einem pandas.DataFrame, alle Spalten verwenden, aber die letzten als Ihr X-Datensatz, und die letzte als Y.

import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LinearRegression 

file_path = "path/to/your/file.csv" 

data = pd.read_csv(filepath_or_buffer = file_path, sep = ";") 

X_train, X_test, y_train, y_test = train_test_split(data.loc[:, data.columns != "name_of_your_last_column"], data.loc[:, data.columns == "name_of_your_last_column"], test_size = 0.25) 

classifier = LinearRegression() 
classifier.fit(X_train, y_train) 

print("Train set score :", classifier.score(X_train, y_train) 
print("Test set score :", classifier.score(X_test, y_test)) 

Bitte beachten Sie, dass dies ein minimales Beispiel ist, sollten Sie eine Quervalidierungsverfahren unter Verwendung von un zu vermeiden Überanpassung und ein Gitter Suchverfahren zu vermeiden derfitting.

+0

Vielen Dank für Ihre Informationen! Ich werde sicher lesen, wie man Fragen stellt. Ich habe meine Frage aufgrund der Dinge, die ich versuchte, etwas verändert. Ich würde gerne wissen, ob die Art, wie ich es gemacht habe, falsch ist oder nicht? Ich habe gestern mit Python3 und sklearn angefangen. Also, ich denke, um Ihr Beispiel zu implementieren, brauche ich nur ein bisschen mehr Zeit, um es zu verstehen. Vielen Dank! Ich schätze deine Antwort. – Gabriela

+1

@Gabriela bitte zeigen Sie Ihre Wertschätzung in der Praxis, indem Sie nützliche Antworten annehmen und/oder aufwerten (die den Befragten wertvolle Zeit in Anspruch nehmen) – desertnaut

Verwandte Themen