Scikit-learn: รับ SGDClassifier เพื่อทำนายเช่นเดียวกับ Logistic Regression


24

วิธีในการฝึกอบรม Logistic Regression คือการใช้การไล่ระดับสีแบบสุ่มสุ่มซึ่ง scikit-learn นำเสนออินเตอร์เฟส

สิ่งที่ฉันต้องการจะทำคือการใช้ scikit การเรียนรู้ของSGDClassifierและมีมันคะแนนเช่นเดียวกับการถดถอยโลจิสติกที่นี่ อย่างไรก็ตามฉันต้องขาดการปรับปรุงการเรียนรู้ของเครื่องเนื่องจากคะแนนของฉันไม่เท่ากัน

นี่คือรหัสปัจจุบันของฉัน ฉันขาดอะไรใน SGDClassifier ที่จะให้ผลลัพธ์เช่นเดียวกับ Logistic Regression

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
import numpy as np
import pandas as pd
from sklearn.cross_validation import KFold
from sklearn.metrics import accuracy_score

# Note that the iris dataset is available in sklearn by default.
# This data is also conveniently preprocessed.
iris = datasets.load_iris()
X = iris["data"]
Y = iris["target"]

numFolds = 10
kf = KFold(len(X), numFolds, shuffle=True)

# These are "Class objects". For each Class, find the AUC through
# 10 fold cross validation.
Models = [LogisticRegression, SGDClassifier]
params = [{}, {"loss": "log", "penalty": "l2"}]
for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:

        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]

        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)
    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

ผลลัพธ์ของฉัน:

Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76

3
คำถามและข้อสังเกต: ความถูกต้องของคุณที่ใช้ในการเรียกใช้ซ้ำแล้วซ้ำอีกเป็นอย่างไร? อัลกอริธึมทั้งสองไม่เท่ากันและจะไม่จำเป็นต้องสร้างความแม่นยำเดียวกันกับข้อมูลเดียวกัน ในทางปฏิบัติคุณสามารถลองเปลี่ยนยุคและหรืออัตราการเรียนรู้สำหรับ SGD ยิ่งไปกว่านั้นคุณสามารถลองใช้คุณสมบัติปกติสำหรับ SGD
image_doctor

ดังนั้นฉันไม่ได้ทดสอบการใช้งาน SGD ซ้ำแล้วซ้ำอีกเพราะข้างต้นใช้การตรวจสอบข้ามแบบ 10 เท่า สำหรับฉันพอเพียงนี้
hlin117

คุณช่วยอธิบายให้ฉันฟังได้ว่าทำไมขั้นตอนวิธีเหล่านี้ไม่เท่ากัน? ถ้าฉันดู SGDClassifier ที่นี่มันกล่าวถึง "การสูญเสีย 'ล็อก' จะให้การถดถอยโลจิสติกซึ่งเป็นลักษณนามลที่น่าจะเป็น" ฉันเชื่อว่ามีช่องว่างในความรู้การเรียนรู้ของเครื่อง
hlin117

หากไม่มีการศึกษาอย่างละเอียดเกี่ยวกับการติดตั้งใช้งานฉันไม่คิดว่าฉันจะสามารถระบุได้อย่างเฉพาะเจาะจงว่าทำไมพวกเขาถึงไม่เท่าเทียมกัน แต่มีข้อบ่งชี้ที่ดีว่าพวกเขาไม่เท่าเทียมกันคือผลลัพธ์ของแต่ละวิธีแตกต่างกันอย่างมาก ฉันเดาว่ามันเกี่ยวกับคุณสมบัติการลู่เข้าของวิธีการประมาณที่ใช้ในแต่ละครั้ง
image_doctor

1
อัลกอริธึมเหล่านี้มีความแตกต่างกันเนื่องจากการถดถอยโลจิสติกใช้การไล่ระดับสีแบบลาดชันโดยที่การไล่ระดับสีแบบสุ่มแบบสุ่มใช้การไล่ระดับสีแบบสุ่มแบบสุ่ม การบรรจบกันของอดีตจะมีประสิทธิภาพมากขึ้นและจะให้ผลลัพธ์ที่ดีกว่า อย่างไรก็ตามเมื่อขนาดของชุดข้อมูลเพิ่มขึ้น SGDC ควรเข้าใกล้ความถูกต้องของการถดถอยโลจิสติก พารามิเตอร์สำหรับ GD หมายถึงสิ่งที่แตกต่างจากพารามิเตอร์สำหรับ SGD ดังนั้นคุณควรลองปรับเล็กน้อย ฉันขอแนะนำให้เล่นกับอัตราการเรียนรู้ (ลดลง) ที่ SGD เล็กน้อยเพื่อพยายามที่จะเข้าหากันมากขึ้น
AN6U5

คำตอบ:


23

ความคิดเห็นเกี่ยวกับหมายเลขการวนซ้ำเป็นจุดที่ ค่าเริ่มต้นSGDClassifier n_iterคือ5คุณทำ5 * num_rowsตามขั้นตอนในพื้นที่น้ำหนัก กฎ sklearn ของหัวแม่มือคือ ~ 1000000 ขั้นตอนสำหรับข้อมูลทั่วไป สำหรับตัวอย่างของคุณเพียงแค่ตั้งค่าเป็น 1,000 และอาจมีค่าความคลาดเคลื่อนก่อน ความแม่นยำของคุณต่ำกว่าด้วยSGDClassifierเนื่องจากขีด จำกัด การทำซ้ำก่อนที่จะยอมรับดังนั้นคุณจึง "หยุดก่อน"

แก้ไขรหัสของคุณอย่างรวดเร็วและสกปรกฉันได้รับ:

# Added n_iter here
params = [{}, {"loss": "log", "penalty": "l2", 'n_iter':1000}]

for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:
        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]
        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)

    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

Accuracy score of LogisticRegression: 0.96
Accuracy score of SGDClassifier: 0.96

4

SGDClassifier ตามชื่อที่แนะนำใช้ Stochastic Gradient descent เป็นอัลกอริธึมการปรับให้เหมาะสม

หากคุณดูที่การใช้งาน LogisiticRegression ใน Sklearn มีห้าเทคนิคการปรับให้เหมาะสม (ตัวแก้ไข) ที่ให้ไว้และโดยค่าเริ่มต้นคือ 'LibLinear' ที่ใช้ Coordinate Descent (CD) เพื่อมาบรรจบกัน

นอกเหนือจากจำนวนการทำซ้ำการเพิ่มประสิทธิภาพประเภทของการทำให้เป็นปกติ (การลงโทษ) และขนาด (C) ก็ส่งผลต่อประสิทธิภาพของอัลกอริทึม

หากคุณใช้งานในการปรับแต่งชุดข้อมูล Iris พารามิเตอร์ hyper เหล่านี้ทั้งหมดอาจไม่ทำให้เกิดการเปลี่ยนแปลงอย่างมีนัยสำคัญ แต่สำหรับชุดข้อมูลที่ซับซ้อนจะมีบทบาทที่มีความหมาย

สำหรับข้อมูลเพิ่มเติมคุณสามารถอ้างเอกสาร Sklearn ถดถอยโลจิสติ


3

คุณควรค้นหากริดสำหรับพารามิเตอร์ไฮเปอร์ "alpha" สำหรับ SGDClassifier มันถูกกล่าวถึงอย่างชัดเจนในเอกสารประกอบ sklearn และจากประสบการณ์ของฉันมีผลกระทบอย่างมากต่อความแม่นยำ พารามิเตอร์ที่สองที่คุณควรดูคือ "n_iter" - อย่างไรก็ตามฉันเห็นเอฟเฟกต์ข้อมูลของฉันน้อยลง


1

TL; DR : คุณสามารถระบุกริดของalphaและn_iter (หรือmax_iter ) และใช้parfitสำหรับการเพิ่มประสิทธิภาพไฮเปอร์บน SGDClassifier

เพื่อนร่วมงานของฉัน Vinay Patlolla เขียนบล็อกโพสต์ที่ดีในวิธีที่จะทำให้ SGD ลักษณนามดำเนินการเช่นเดียวกับการถดถอยโลจิสติใช้ Parfit

Parfitเป็นแพ็คเกจการเพิ่มประสิทธิภาพพารามิเตอร์แบบหลายพารามิเตอร์ที่เขาใช้เพื่อค้นหาการรวมกันของพารามิเตอร์ที่เหมาะสมซึ่งทำหน้าที่เพิ่มประสิทธิภาพ SGDClassifier เพื่อดำเนินการเช่นเดียวกับ Logistic Regression บนชุดข้อมูลตัวอย่างของเขาในเวลาที่น้อยลง

โดยสรุปสองตัวแปรสำคัญสำหรับ SGDClassifier มีอัลฟาและn_iter ในการอ้าง Vinay โดยตรง:

n_iter ใน sklearn จะไม่มีค่าเริ่มต้น เราตั้งค่าไว้ที่นี่เป็นจำนวนมากพอสมควร (1,000) พารามิเตอร์ทางเลือกของ n_iter ซึ่งเพิ่งถูกเพิ่มเข้ามาคือ max_iter คำแนะนำเดียวกันควรใช้กับ max_iter

อัลฟาไฮเปอร์พารามิเตอร์ทำหน้าที่จุดประสงค์สองอย่าง มันเป็นทั้งพารามิเตอร์ regularization และอัตราการเรียนรู้เริ่มต้นภายใต้ตารางเริ่มต้น ซึ่งหมายความว่านอกเหนือไปจากการทำให้สัมประสิทธิ์ Logistic Regression เป็นปกติแล้วผลลัพธ์ของโมเดลขึ้นอยู่กับการโต้ตอบระหว่างอัลฟ่าและจำนวน epochs (n_iter) ที่รูทีนการดำเนินการเหมาะสม โดยเฉพาะเมื่อแอลฟามีขนาดเล็กมากจะต้องเพิ่ม n_iter เพื่อชดเชยอัตราการเรียนรู้ที่ช้า นี่คือเหตุผลว่าทำไมจึงปลอดภัยกว่า (แต่ช้ากว่า) ในการระบุ n_iter ที่มีขนาดใหญ่พอสมควรเช่น 1,000 เมื่อค้นหาในช่วงกว้างของอัลฟา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.