Dernière fois Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (6) https://github.com/legacyworld/sklearn-basic
Le commentaire est 5 (1) toutes les 21 minutes Quand j'ai lu le devoir, j'ai pensé que c'était une victoire facile, mais quand j'ai regardé l'explication, c'était impossible avec scikit-learn car c'était (probablement) La raison est que je n'ai pas pu trouver un moyen de dessiner un graphique qui affiche la perte à chaque fois que je bouge par étapes. Comme c'est un gros problème, j'ai mis en œuvre ce qui suit pour étudier diverses choses.
Lorsque j'ai cherché sur Google, il existe de nombreuses méthodes re-soudaines, mais je n'en trouve pas beaucoup qui incluent la régression des crêtes. C'est l'explication mathématique. https://www.kaggle.com/residentmario/ridge-regression-cost-function
\lambda =Paramètres de régularisation,
\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 Correction)
Avec ces données sur le vin, $ m = 11, N = 1599 $ Lorsqu'il est appliqué au programme
Pour le programme, reportez-vous à ce qui suit. Apprentissage automatique depuis le début: modèle de régression multiple par la méthode de descente la plus raide - De zéro avec Python et 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()Mis en œuvre
def fit(self, X, y):
self.coef_ = self.grad_desc(X,y)
#fit se retourne
return self
# predict()Mis en œuvre
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
#Types de fonctionnalités
dim = X.shape[1]
#Valeur initiale de la version bêta
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-Importer des données de vin à partir de lean
df= pd.read_csv('winequality-red.csv',sep=';')
#Étant donné que la qualité de la valeur cible est incluse, créez une trame de données supprimée
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) #Ajouter 1 à la première colonne
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}")
#Sortie du coefficient: Puisque la section est incluse au tout début, retirez-la de la seconde et sortez la section à la fin.
i = 1
for column in df1.columns:
print(column,coef[i][0])
i+=1
print('intercept',coef[0][0])
plt.savefig("gd.png ")
J'ai également inclus la vérification des croisements, j'ai donc créé mon propre estimateur.
Estimator est fondamentalement quelque chose comme linear_model.Ridge
, et si vous le mettez dans l'argument de cross_validation, vous pouvez obtenir K-fold, etc.
Il vous suffit d'implémenter au moins deux méthodes (fit, predict
) dans votre classe (n'importe quel nom). C'est très facile.
Le calcul est également simple, calculez le coût en changeant $ \ beta $, et si le coût devient inférieur à $ \ epsilon $ (epsilon), il se termine.
Dans la partie de loss.append
au milieu de ce calcul, la manière dont elle change lorsque l'étape est modifiée est stockée dans la liste.
Cette fois, je ne pouvais pas du tout voir le code source dans la vidéo d'explication, donc je ne savais pas sur quoi le paramètre de régularisation était réglé. Je pense que c'est la valeur par défaut (= 0,0001) dans SGDregressor de sklearn, mais j'ai également recherché l'endroit où l'erreur de test de vérification croisée est minimisée. La boucle est donc doublée. En changeant $ \ eta $ de 0,3,0.1,0.03, $ \ lambda $ passe de $ 10 ^ {-5} $ à $ \ frac {1} {2 \ eta} $. J'ai fait en sorte que $ 1-2 \ lambda \ eta $ ne devienne pas négatif. $ \ Epsilon $, qui détermine la fin du calcul, était de 10 $ ^ {-7} $ lorsque le nombre de calculs était le même que l'explication.
Cliquez ici pour les résultats des calculs
Les formes sont presque les mêmes, donc ça va. Les coefficients et sections réellement obtenus sont également presque corrects. Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (1) Ce n'est pas si différent de ce que vous avez demandé sur le lien ci-dessus.
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
Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (1) Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (2) Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (3) Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (4) Cours d'apprentissage automatique à l'Université de Tsukuba: étudier sklearn tout en intégrant le script Python au devoir (5) https://github.com/legacyworld/sklearn-basic
Recommended Posts