1. 程式人生 > >線性迴歸之邏輯迴歸實戰

線性迴歸之邏輯迴歸實戰

Logit迴歸

     前面說了線性的邏輯迴歸,對於線性的邏輯迴歸,因變數與自變數都是連續的,因變數與自變數之間呈線性的關係,當我們用邏輯迴歸來解決分類問題時,分類的值肯定是離散的,此時如果能將因變數轉為連續的值,自變數與轉換值之間就可能存呈線性的關係,此時就可以使用線性迴歸來解決分類的問題。怎樣理解這個轉換是理解線性迴歸用於分類的關鍵點。

    我們先來考慮一個二分類問題,對於Y發生的期望,他等價於事件發的概率,事件發生的概率的值域在[0,1]區間,那麼因變數是不是與事件發生的概率程線性的關係呢?

Logit迴歸函式

    對於Logistic迴歸,我們先不給證明的給出一些公式,後面結合這些函式去理解。

Logistic/sigmoid函式:

                                                             g(z) = \frac{1}{1+e^{-z}} \\ h_0(x) = g(\theta^Tx) = \frac{1}{1+e^{-\theta^T X}}

假設對於二項式分佈:

                                                    P(y=1|x,\theta) = h_0(x) \\ P(y=0|x,\theta) = 1-h_0(x)

一個事件的機率odds,是指一個事情發與不發概率的比值:

                                                   log\frac{p}{1-p} = log \frac{h_0(x)}{1-h_0(x)} = log(\frac{\frac{1}{1+e^-\theta^T x}}{1-\frac{1}{1+e^-\theta^T x}}) = \theta^Tx

從上面的公式可以看出,odds其實是一個線性的,所以我們設定合適的閾值就可以將連續的問題轉換為一個分類問題。反過來說,分類問題可以看出一個odds,發生與不發生的對數比值是一個線性問題。

Logistic 程式實戰

# -*- coding:utf-8 -*-

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score



if __name__ == "__main__":
    data = pd.read_excel("shouru50w.xlsx")
    data[u'收入水平'] = pd.Categorical(data[u'收入水平']).codes
    data[u'性別'] = pd.Categorical(data[u'性別']).codes
    #x = data[[u'年齡', u'受教育時間', u'性別', u'資產淨增', u'資產損失', u'一週工作時間']]
    #y = data[[u'收入水平']]
    x, y = np.split(data.values.astype('float64'), (6,), axis=1)

    lr = Pipeline([('sc', StandardScaler()),
                   ('poly', PolynomialFeatures(degree=1,interaction_only=False)),
                   ('clf', LogisticRegression())])
    # print y
    lr.fit(x, y.ravel())
    y_hat = lr.predict(x)
    y_hat_prob = lr.predict_proba(x)
    np.set_printoptions(suppress=True)
    # print 'y_hat = \n', y_hat
    # print 'y_hat_prob = \n', y_hat_prob
    print u'準確度:%.2f%%' % (100 * np.mean(y_hat == y.ravel()))
    print "R2 %s" % r2_score(y, y_hat)

    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)

    lr.fit(x_train, y_train.ravel())
    y_train_hat = lr.predict(x_train)
    y_train_hat_prob = lr.predict_proba(x_train)
    print u'train 準確度:%.2f%%' % (100 * np.mean(y_train_hat == y_train.ravel()))
    print "R2 %s" % r2_score(y_train, y_train_hat)


    y_test_hat = lr.predict(x_test)
    y_test_hat_prob = lr.predict_proba(x_test)
    print u'test 準確度:%.2f%%' % (100 * np.mean(y_test_hat == y_test.ravel()))
    print "R2 %s" % r2_score(y_test, y_test_hat)
    print lr.named_steps['clf'].coef_
    print lr.named_steps['clf'].intercept_

資料:

執行結果: