機器學習_ML_LogisticRegression
這是由國立臺灣大學所開發的。邏輯斯迴歸能處理線性與二元分類的問題,在線性可分的情況下效能非常佳,可利用OvR技術擴展到多元分類
LogisticRegression和LogisticRegressionCV的差異在LogisticRegressionCV使用了交叉驗證來選擇正則化係數C。而LogisticRegression需要自己每次指定一個正則化係數。
除了交叉驗證,以及選擇正則化係數C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
邏輯斯迴歸透過了Sigmoid計算來判斷是否過門檻值,過了就是屬於那一類。
def sigomid(z):
return 1.0 / (1.0 + np.exp(-z))
當z趨近正無限大的時候,所得的結果是趨近於1的,因為是趨近於0,所以分母極小。反之,z趨近負無限大的時候,所以結果趨近於0,因會讓分母極大化。
只是,雖然邏輯斯迴歸是分類用的,但是還是取的出斜率跟截距。
IMPORT
from sklearn.linear_model import LogisticRegression
CLASS
class sklearn.linear_model.LogisticRegression(
penalty='l2',
dual=False,
tol=0.0001,
C=1.0,
fit_intercept=True,
intercept_scaling=1,
class_weight=None,
random_state=None,
solver='liblinear',
max_iter=100,
multi_class='ovr',
verbose=0,
warm_start=False,
n_jobs=1
參數說明
penalty
default l2 {l1, l2}正規化方式選擇,當結果過適的時候可以考慮使用l1
這部份影響損失函數的選擇
當選擇l1的時候,solver只能是liblinear
如果是l2的話可以{newton-cg, lbfgs, liblinear, sag}
主要的差異在於這三種演算法時都需要損失函數的一階或者二階連續導數,但是在liblinear並沒有這類的處理。
對l1、l2的差異,可以參考莫煩的說明
dual
default False只適用於solver為liblinear的情況!
當訓練資料集數量較訓練資料集特徵數時,優先使用False
tol
default 0.0001迭代終止判據的誤差範圍
C
default 1.0C為正規化係數λ的倒數,必需是正數!(反正規化)
值愈小,則正規化越高。
fit_intercept
default True是否將截距列入計算式,就是我們求出來y=ax+b的那個b!
intercept_scaling
default 1僅solver為liblinear,且fit_intercept設置為True時有效果。
為了減少正則化對合成特徵權重的影響(因此在截距上),必須增加intercept_scaling!
class_weight
default None權重參數
None_即權重平等
balance_會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。(n_samples /(n_classes * np.bincount(y)))
class_weight={0:0.6, 1:0.4} 自訂權重 類型0為60%,1為40%
random_state
default None隨機數種子,僅在solver為{sag,liblinear}時有效果!
solver
default liblinear {newton-cg, lbfgs, liblinear, sag, saga}多類別則僅適用{‘newton-cg’, ‘sag’, ‘saga’ and ‘lbfgs’}
liblinear_multi_class只支援ovr
資料集/正規化 | l1 | l2 |
---|---|---|
大資料 | ‘saga’ | ‘sag’ |
小資料 | ‘liblinear’ | |
不限資料集 | ‘newton-cg’,‘lbfgs’ |
liblinear:國立臺灣大學_大型線性分類A Library for Large Linear Classification
蠻怪的,scikit-learn定位為小資料集用,而參考原文是定義在百萬資料集!
saga:適用於非凸集合資料集
lbfgs:擬牛頓法BFGS算法的改進。L-BFGS算法的基本是:算法只保存並利用最近m次疊代的曲率信息來構造海森矩陣的近似矩陣…
原文網址:https://read01.com/zzLgj.html
max_iter
default 100算法收斂的最大迭代次數
僅對{‘newton-cg’, ‘sag’, ‘lbfgs’}有影響
multi_class
default ovr {ovr, multinomial(mvm)}分類方式的選擇
兩者在二元邏輯迴歸上並沒有差別,主要差別在多元邏輯迴歸!
ovr單純在不管你是幾元,就是看成二元,對於第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例,然後在上面再做二元邏輯回歸,得到第K類的分類模型。
mvm分類較為精確,但ovr分類較為快速。
如果是ovr的話,那solver都可以選擇
但如果是mvm的話,就是{newton-cg, lbfgs, sag}
不適用liblinear
verbose
default 0過程是否輸出
0不輸出
1偶爾輸出
1就一定輸出
warm_start
default False如果True,則下一次訓練是以追加的形式進行(重新使用上一次的模型作為初始化)
不適用{liblinear}
n_jobs
default 1訓練時的cpu使用數
方法
decision_function(X)
預測樣品的可信度densify()
將係數矩陣轉換為密集數組格式fit(X, y[, sample_weight])
適合(訓練)模型get_params([deep])
取得模型參數predict(X)
預測x的目標標籤predict_log_proba(X)
回傳類別概率對數(機率、或然率)predict_proba(X)
回傳類別概率(機率、或然率)score(X, y[, sample_weight])
回傳平均精度set_params(**params)
設置參數sparsify()
將係數矩陣轉換為稀疏格式屬性
coef_
斜率intercept_
截距n_iter_
所有類別的實際迭代次數其它
正則化 | 算法 | 適用場景 |
---|---|---|
L1 | liblinear | liblinear適用於小數據集;如果選擇L2正則化發現還是過擬合,即預測效果差的時候,就可以考慮L1正規化;如果模型的特徵非常多,希望一些不重要的特徵係數歸零,從而讓模型係數稀疏化的話,也可以使用L1正規化。 |
L2 | liblinear | libniear只支持多元邏輯回歸的OvR,不支持MvM,但MVM相對精確。 |
L2 | lbfgs/newton-cg/sag | 較大數據集,支持one-vs-rest(OvR)和many-vs-many(MvM)兩種多元邏輯回歸。 |
L2 | sag | 如果樣本量非常大,比如大於10萬,sag是第一選擇;但不能用於L1正規化。 |
範例
# 取得資料
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
# 資料分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0)
# 資料標準化
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# 載入邏輯斯迴歸
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1000.0,
random_state=0)
lr.fit(X_train_std, y_train)
lr.predict_proba(X_test_std) # 回傳各特徵的各目標標籤的機率
沒有留言:
張貼留言