Hallo, das ist Motty. Dieses Mal habe ich die Regressionsanalyse mit Python beschrieben.
Die Regressionsanalyse ist eine Methode zur Vorhersage der Zieldaten unter Verwendung der vorliegenden Daten. Zu diesem Zeitpunkt wird die Struktur der quantitativen Beziehung auf die Daten angewendet (Regressionsmodell). Wenn das Regressionsmodell eine gerade Linie ist, wird es als Regressionslinie bezeichnet, und wenn die Funktion n-ter Ordnung durch Polypoly-Regression angewendet wird, wird sie als Regressionskurve bezeichnet.
Die Methode der kleinsten Quadrate wird verwendet, um das angepasste Modell zu bewerten. Eine Methode zur Auswahl eines Koeffizienten, der die Summe der Quadrate der Residuen minimiert, wenn die durch Messung erhaltenen Daten mit einer Funktion wie einer geraden Linie angenähert werden.
Verwenden Sie den Bestimmungskoeffizienten. Je höher diese Zahl ist, desto besser passt das Regressionsmodell an die tatsächlichen Daten an. Wenn der beobachtete Wert = y und der geschätzte Wert durch die Funktion f ist, wird er durch die folgende Gleichung ausgedrückt.
Wenn das Modell perfekt zu den Daten passt, beträgt der Wert des Entscheidungsfaktors 1.
Für Daten mit Rauschen, die zu jeder der linearen, quadratischen und kubischen Funktionen hinzugefügt werden Ich habe eine Regressionslinie angewendet.
LinearRegression.py
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#sklearn
from sklearn.linear_model import LinearRegression as reg
from sklearn.metrics import r2_score
#Daten bezogen
CI =["black","red","blue","yellow","green","orange","purple","skyblue"]#ColorIndex
N = 30 #Anzahl von Beispielen
x = np.linspace(1,10,N)
y1 = x *5 + np.random.randn(N)*5
y2 = 2*(x-2)*(x-7) + np.random.randn(N)*5
y3 = 3*(x-1)*(x-4)*(x-7) + np.random.randn(N)*10
x = x.reshape([-1,1])
y1 = y1.reshape([-1,1])
y2 = y2.reshape([-1,1])
y3 = y3.reshape([-1,1])
#Lernen
clf1, clf2, clf3 = reg(),reg(),reg()
clf1.fit(x,y1),clf2.fit(x,y2),clf3.fit(x,y3)
#x Voraussichtlicher Wert für Daten
y1_pred,y2_pred,y3_pred = clf1.predict(x),clf2.predict(x),clf3.predict(x)
#Zeichnung
fig = plt.figure(figsize = (15,15))
ax1,ax2,ax3 = fig.add_subplot(3,3,1),fig.add_subplot(3,3,2),fig.add_subplot(3,3,3)
#Data
ax1.scatter(x,y1,c = CI[1],label = "R^2 = {}".format(r2_score(y1,y1_pred)))
ax2.scatter(x,y2,c = CI[2],label = "R^2 = {}".format(r2_score(y2,y2_pred)))
ax3.scatter(x,y3,c = CI[3],label = "R^2 = {}".format(r2_score(y3,y3_pred)))
ax1.legend(),ax2.legend(),ax3.legend()
#Gerade zurückgeben
ax1.plot(x,clf1.predict(x), c = CI[0])
ax2.plot(x,clf2.predict(x), c = CI[0])
ax3.plot(x,clf3.predict(x), c = CI[0])
fig.suptitle("RinearLegression", fontsize = 15)
ax1.set_title("1")
ax2.set_title("2")
ax3.set_title("3")
Es überrascht nicht, dass die Ergebnisse zeigen, dass die gerade Linienanpassung für lineare Funktionen am besten ist.
Es kann angebracht sein, eine Regressionskurve wie eine Funktion mit mehreren Ordnungen auf einen Datensatz wie 2 oder 3 anzuwenden.
polynomial.py
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as reg
from sklearn.metrics import r2_score
from sklearn.preprocessing import PolynomialFeatures as PF
#Daten bezogen
CI =["black","red","blue","yellow","green","orange","purple","skyblue"]#ColorIndex
N = 10 #Anzahl von Beispielen
x = np.linspace(1,10,N)
y3 = 3*(x-1)*(x-4)*(x-7) + np.random.randn(N)*10
x = x.reshape([-1,1])
y3 = y3.reshape([-1,1])
#Lernen
clf = reg()
clf.fit(x,y3)
#Auftrag
DegreeSet =[1,2,3]
for dg in DegreeSet:
pf = PF(degree = dg, include_bias = False)
x_poly = pf.fit_transform(x)
poly_reg = reg()
poly_reg.fit(x_poly,y3)
polypred = poly_reg.predict(x_poly)
#x Voraussichtlicher Wert für Daten
pred = clf.predict(x)
#Zeichnung
plt.scatter(x,y3,c = CI[dg], label = "R^2={}".format(r2_score(y3,polypred)))
plt.plot(x, polypred,c = CI[0])
plt.legend()
plt.title("Regression")
plt.show()
Infolgedessen passt das Modell gut und der Bestimmungskoeffizient ist jedes Mal hoch, wenn die Reihenfolge auf 1, 2 und 3 erhöht wird.
Je höher die Reihenfolge, desto aussagekräftiger wird das Modell und desto besser passt es in die Daten. Je höher die Reihenfolge, desto geringer ist die Generalisierungsleistung (Überlernen). Um ein solches Problem zu lösen, ist es ratsam, eine einfache lineare Regression, AIC oder andere Strafen zu verwenden.
(Als wir die Anpassung der Daten an das Modell auf das AIC-Minimierungsproblem reduziert haben Wie Sie der Formel entnehmen können, werden Strafen für die Erhöhung der Reihenfolge festgelegt und die optimale Reihenfolge kann ausgewählt werden. )
Da sklearn nicht über die richtige Bibliothek verfügte, plane ich, das Modell mit meinem eigenen AIC als Fortsetzung zu bewerten.
Recommended Posts