0

Ich habe ein Tutorial verfolgt, um logistische Gradientenabstieg in Python zu implementieren. Hier
ist der Link: http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-3/

Seine ipython Notebook Github für diese especific Übung hier:
https://github.com/jdwittenauer/ipython-notebooks/blob/master/notebooks/ml/ML-Exercise2.ipynb

Hier ist mein Code für dieses Problem:
Logistischer Gradient Abstieg konvergiert nicht in Python fmin_tnc

import pandas as pd 
import matplotlib.pylab as plt 
import numpy as np 
import scipy.optimize as opt 


def sigmoid(Z): 
    '''Compute the sigmoid function ''' 
    return 1.0/(1.0 + np.exp(-1.0 * Z)) 

########################################### 


def compute_cost(theta,X,y, learningRate): 
    '''compute cost given ''' 

    theta = np.matrix(theta) 
    X = np.matrix(X) 
    y = np.matrix(y) 
    m = y.size 
    theta0 = np.zeros((1,X.shape[1])) 
    theta0[0,1:] = theta[0,1:]  

    reg = np.dot((learningRate/2*m),(theta0.T.dot(theta0))) 

    Z = X.dot(theta.T) 

    hypothesis = sigmoid(Z) 
    exp1 = (-y.T.dot(np.log(hypothesis))) 
    exp2 = ((1.0 - y).T.dot(np.log(1.0 - hypothesis)))  
    J = (exp1 - exp2).dot(1/m) 

    return J.sum() + reg.sum() 



def grad(theta,X,y,learningRate):  

    theta = theta.T   
    X = np.matrix(X) 
    y = np.matrix(y) 
    m = y.shape[0] 
    theta0 = np.zeros(X.shape[1])  
    theta0[1:] = theta[1:]  
    theta = np.matrix(theta)  
    theta0 = np.matrix(theta0) 

    reg = np.dot(learningRate/m, theta) 

    Z = X.dot(theta.T)  
    hypothesis = sigmoid(Z)  
    error = hypothesis - y   
    grad = np.dot((X.T.dot(error).flatten()),1/m) + reg 
    grad= grad.flatten() 
    grad   

## 
def predict(theta, X):  
    probability = sigmoid(X * theta.T) 
    return [1 if (x >= 0.5) else 0 for x in probability] 


Hier heißt der Code:
Daten2 = pd.read_csv ('ex2data2.txt', header = None, names = [ 'Test 1', 'Test 2', 'Akzeptiert'])

y = data2[data2.columns[-1]].as_matrix() 
m = len(y) 
y = y.reshape(m, 1) 
X = data2[data2.columns[:-1]] 
X = X.as_matrix() 
_lambda = 1 

from sklearn.preprocessing import PolynomialFeatures 

#Get all high order parameters 
feature_mapper = PolynomialFeatures(degree=6) 
X = feature_mapper.fit_transform(X) 

# convert to numpy arrays and initalize the parameter array theta 

theta = np.zeros(X.shape[1]) 

learningRate = 1 

compute_cost(theta, X, y, learningRate)   

result = opt.fmin_tnc(func=compute_cost,x0=theta,fprime=grad,args= (X,y,learningRate)) 

Für eine Variable alles geklappt hat, aber mit mehr Funktionen (Übung 2) hat es nicht gut funktioniert. Alles bis zur Verwendung der optimierten Gradientenabstiegsfunktion (fmin_tnc) war exakt gleich.
Irgendwie konvergiert sogar sein Code nicht zum erwarteten Wert. Er ist es sein Blog Beispiel zeigt, was man für das Ergebnis fmin_tnc
his call and expected result for fmin_tnc

sein, aber wenn Sie bei jedem Schritt seines Code folgen Sie folgendes Ergebnis:
Result giving by his code


Nun, wie Sie können Sehen Sie, es ist ein bisschen anders. Aber ich habe eine andere Sache in seinem Code entdeckt. Er ließ 2 Spalten "Test 1" und "Test 2" fallen und behielt nur die Parameter hoher Ordnung. Das fühlt sich komisch an, denn in Andrew Ngs Lösung lässt er keine Spalte des Tisches fallen, aber er benutzt 28 Funktionen. Dieser verwendet nur 11 Funktionen. Ich habe andere Codes gefunden und wollte, dass meine Funktion cost_function und gradient funktioniert. Ich glaube, dass sie an einem lokalen Minimum hängen bleiben und nicht konvergieren.
Mein letzter Versuch habe ich mit allen 28 Features gemacht, genau wie Andrew's dataFrame. Leider habe ich ein anderes Ergebnis bekam, wie Sie unten sehen können:
FInal Result
Wie Sie sehen können, habe ich eine höhere Genauigkeit bekam aber meine Kosten bleibt höher als die erwartete, nämlich: 0,52900
Meine Absicht ist es nicht, die Codequalität des Blogs zu verringern. Ich folge immer noch seinen Schritten auf anderen Tutorials und scheint eine gute Quelle zu sein.
Unten ist ein Link zu meinem Code, ich benutze fmin_tnc genau so, wie er es macht. Ich habe gerade eine stärker vektorisierte gradient_function erstellt. Der Name der Datei ist Regression Logistic Regularized.py

Github: https://github.com/vinipachecov/Machine-Learning/tree/master/Logistic%20Regression

Antwort

0

Das Problem ist, dass ich mit Python 3.6 und der Autor wurde mit Python 2.7.X. Durch das Ändern der Version in Python 2.7.13 wurde dieses Problem behoben.

Verwandte Themen