Letztes Mal Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (6) https://github.com/legacyworld/sklearn-basic
Kommentar ist 5. (1) pro 21 Minuten Als ich die Aufgabe las, dachte ich, es sei ein einfacher Gewinn, aber als ich mir die Erklärung ansah, war es mit Scikit-Learn unmöglich, wie es (wahrscheinlich) war. Der Grund dafür ist, dass ich keine Möglichkeit gefunden habe, ein Diagramm zu zeichnen, in dem Verlust jedes Mal angezeigt wird, wenn ich mich schrittweise bewege. Da es eine große Sache ist, habe ich Folgendes implementiert, um verschiedene Dinge zu studieren.
Wenn Sie googeln, gibt es viele Methoden, die plötzlich auftreten, aber ich kann nicht viele finden, die eine Gratregression beinhalten. Dies ist die mathematische Erklärung. https://www.kaggle.com/residentmario/ridge-regression-cost-function
\lambda =Regularisierungsparameter,
\beta = \begin{pmatrix} \beta_0 \\ \beta_1\\ \vdots \\ \beta_m \end{pmatrix},
y = \begin{pmatrix} y_1 \\ y_2 \\ \vdots \\ y_N \end{pmatrix},
X = \begin{pmatrix}
1&x_{11}&x_{12}&\cdots&x_{1m}\\
1&x_{21}&x_{22}&\cdots&x_{2m}\\
\vdots\\
1&x_{N1}&x_{N2}&\cdots&x_{Nm}
\end{pmatrix}\\ \\
\beta^{t+1} = \beta^{t}(1-2\lambda\eta) - \eta\frac{1}{N}X^T(X\beta^t-y) (※2020/5/31 Korrektur)
Mit diesen Weindaten ist $ m = 11, N = 1599 $ Bei Anwendung auf das Programm
Informationen zum Programm finden Sie im Folgenden. Maschinelles Lernen von Anfang an: Multiples Regressionsmodell nach der Methode des steilsten Abstiegs - Von Grund auf mit Python und R-
python:Homework_4.3GD.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.base import BaseEstimator
from sklearn.model_selection import cross_validate
import statsmodels.api as sm
class MyEstimator(BaseEstimator):
def __init__(self,ep,eta,l):
self.ep = ep
self.eta = eta
self.l = l
self.loss = []
# fit()Implementiert
def fit(self, X, y):
self.coef_ = self.grad_desc(X,y)
#fit kehrt selbst zurück
return self
# predict()Implementiert
def predict(self, X):
return np.dot(X, self.coef_)
def grad_desc(self,X,y):
m = len(y)
loss = []
diff = 10**(10)
ep = self.ep
#Arten von Funktionen
dim = X.shape[1]
#Anfangswert von Beta
beta = np.ones(dim).reshape(-1,1)
eta = self.eta
l = self.l
while abs(diff) > ep:
loss.append((1/(2*m))*np.sum(np.square(np.dot(X,beta)-y)))
beta = beta*(1-2*l*eta) - eta*(1/m)*np.dot(X.T,(np.dot(X,beta)-y))
if len(loss) > 1:
diff = loss[len(loss)-1] - loss[len(loss)-2]
self.loss = loss
return beta
#scikit-Importieren Sie Weindaten aus Lean
df= pd.read_csv('winequality-red.csv',sep=';')
#Da die Zielwertqualität enthalten ist, erstellen Sie einen abgelegten Datenrahmen
df1 = df.drop(columns='quality')
y = df['quality'].values.reshape(-1,1)
X = df1.values
scaler = preprocessing.StandardScaler()
X_fit = scaler.fit_transform(X)
X_fit = sm.add_constant(X_fit) #Fügen Sie 1 zur ersten Spalte hinzu
epsilon = 10 ** (-7)
eta_list = [0.3,0.1,0.03]
loss = []
coef = []
for eta in eta_list:
l = 10**(-5)
test_min = 10**(9)
while l <= 1/(2*eta):
myest = MyEstimator(epsilon,eta,l)
myest.fit(X_fit,y)
scores = cross_validate(myest,X_fit,y,scoring="neg_mean_squared_error",cv=10)
if abs(scores['test_score'].mean()) < test_min:
test_min = abs(scores['test_score'].mean())
loss = myest.loss
l_min = l
coef = myest.coef_
l = l * 10**(0.5)
plt.plot(loss)
print(f"eta = {eta} : iter = {len(loss)}, loss = {loss[-1]}, lambda = {l_min}")
#Ausgabe des Koeffizienten: Da der Abschnitt ganz am Anfang enthalten ist, nehmen Sie ihn aus dem zweiten heraus und geben Sie den Abschnitt am Ende aus.
i = 1
for column in df1.columns:
print(column,coef[i][0])
i+=1
print('intercept',coef[0][0])
plt.savefig("gd.png ")
Ich habe auch die Kreuzungsverifizierung eingeschlossen, also habe ich meinen eigenen Schätzer erstellt.
Estimator ist im Grunde so etwas wie "linear_model.Ridge", und wenn Sie es in das Argument "cross_validation" einfügen, können Sie K-fach usw. ausführen.
Sie müssen nur mindestens zwei Methoden ("anpassen, vorhersagen") in Ihrer Klasse implementieren (beliebiger Name). Es ist sehr leicht.
Die Berechnung ist auch einfach: Berechnen Sie die Kosten, während Sie $ \ beta $ ändern. Wenn die Kosten kleiner als $ \ epsilon $ (epsilon) werden, endet sie.
In dem Teil von loss.append
in der Mitte dieser Berechnung wird in der Liste gespeichert, wie sich der Schritt ändert, wenn er geändert wird.
Dieses Mal konnte ich den Quellcode im Erklärungsvideo überhaupt nicht sehen, daher wusste ich nicht, auf was der Regularisierungsparameter eingestellt war. Ich denke, dass dies der Standardwert (= 0,0001) in SGDregressor von sklearn ist, aber ich habe auch nach dem Ort gesucht, an dem der Testfehler der Gegenüberstellung minimiert wird. Die Schleife wird also verdoppelt. Während $ \ eta $ um 0,3,0,1,0,03 geändert wird, wird $ \ lambda $ von $ 10 ^ {-5} $ in $ \ frac {1} {2 \ eta} $ geändert. Ich habe es so gemacht, dass $ 1-2 \ lambda \ eta $ nicht negativ wird. $ \ Epsilon $, das das Ende der Berechnung bestimmt, war $ 10 ^ {-7} $, wenn die Anzahl der Berechnungen der Erklärung entsprach.
Klicken Sie hier für Berechnungsergebnisse
Die Formen sind fast gleich, also ist es okay. Die tatsächlich erhaltenen Koeffizienten und Abschnitte sind ebenfalls nahezu korrekt. Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (1) Es unterscheidet sich nicht so sehr von dem, was Sie unter dem obigen Link angefordert haben.
eta = 0.3 : iter = 211, loss = 0.20839282208794876, lambda = 0.000316227766016838
fixed acidity 0.049506870332573755
volatile acidity -0.19376515874038097
citric acid -0.03590899184362026
residual sugar 0.02477115609195419
chlorides -0.08766609020245213
free sulfur dioxide 0.04504300145052993
total sulfur dioxide -0.1066524471717945
density -0.039236958974544434
pH -0.060484490718680374
sulphates 0.1558562351611723
alcohol 0.29101267115037016
intercept 5.632460233437699
eta = 0.1 : iter = 539, loss = 0.20839849335391505, lambda = 0.000316227766016838
fixed acidity 0.05411085995631372
volatile acidity -0.19374570028895227
citric acid -0.03641567617051897
residual sugar 0.026096674744724647
chlorides -0.08728538562384357
free sulfur dioxide 0.044674324756584935
total sulfur dioxide -0.10616011146688299
density -0.04332301301614413
pH -0.05803157075853309
sulphates 0.15635770126837817
alcohol 0.28874633335328637
intercept 5.632460233437699
eta = 0.03 : iter = 1457, loss = 0.2084181454096448, lambda = 0.000316227766016838
fixed acidity 0.06298223685986547
volatile acidity -0.19369711526783526
citric acid -0.03737402225868385
residual sugar 0.028655773905239445
chlorides -0.08655776298773829
free sulfur dioxide 0.04397075187169952
total sulfur dioxide -0.10522175105302445
density -0.051210328173935296
pH -0.05330134909461606
sulphates 0.15732818468260018
alcohol 0.28436648926510527
intercept 5.632460233437668
Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (1) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (2) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (3) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (4) Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (5) https://github.com/legacyworld/sklearn-basic
Recommended Posts