線性迴歸之邏輯迴歸實戰
阿新 • • 發佈:2019-02-04
Logit迴歸
前面說了線性的邏輯迴歸,對於線性的邏輯迴歸,因變數與自變數都是連續的,因變數與自變數之間呈線性的關係,當我們用邏輯迴歸來解決分類問題時,分類的值肯定是離散的,此時如果能將因變數轉為連續的值,自變數與轉換值之間就可能存呈線性的關係,此時就可以使用線性迴歸來解決分類的問題。怎樣理解這個轉換是理解線性迴歸用於分類的關鍵點。
我們先來考慮一個二分類問題,對於Y發生的期望,他等價於事件發的概率,事件發生的概率的值域在[0,1]區間,那麼因變數是不是與事件發生的概率程線性的關係呢?
Logit迴歸函式
對於Logistic迴歸,我們先不給證明的給出一些公式,後面結合這些函式去理解。
Logistic/sigmoid函式:
假設對於二項式分佈:
一個事件的機率odds,是指一個事情發與不發概率的比值:
從上面的公式可以看出,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_
資料:
執行結果: