sklearn的逻辑回归
?官方邏輯回歸鏈接
sklearn.linear_model.LogisticRegression — scikit-learn 1.0.2 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
一,參數說明
1.1重要參數solver(求解器)詳解
該參數用于優化問題,達到線性收斂的結果,相當于對邏輯回歸進行優化
該參數對應的選項有
{'newton-cg','lbfgs','liblinear','sag','saga'},默認 ='lbfgs'
newton-cg
傳統的牛頓法是每一次迭代都要求Hessian矩陣的逆,這個復雜度就很高,為了避免求矩陣的逆,Newton-CG就用CG共軛梯度法來求解線性方程組,從而避免了求矩陣逆。
lbfgs
有限內存中進行BFGS算法
L-BFGS算法是一種在牛頓法基礎上提出的一種求解函數根的算法
一文讀懂L-BFGS算法_激進的蝸牛-CSDN博客_lbfgs接前一篇:邏輯回歸(logistics regression) 本章我們來學習L-BFGS算法.L-BFGS是機器學習中解決函數最優化問題比較常用的手段,本文主要包括以下六部分: 1-L-BFGS算法簡介 2-牛頓法求根問題 3-牛頓法求函數的駐點 4-...https://blog.csdn.net/weixin_39445556/article/details/84502260
L-BFGS剖析_golden_xuhaifeng的博客-CSDN博客_lbfgs????機器學習中經常利用梯度下降法求最優解問題,通過大量的迭代來得到最優解,但是對于維度較多的數據,除了占用大量的內存還會很耗時,L-BFGS算法是一種在牛頓法基礎上提出的一種求解函數根的算法,下面由簡入深盡量用簡潔的語言剖析算法的本質。一.牛頓法????解決函數求根問題 f(x)函數在x1點的導數,是該函數在x1點的切線的斜率y/x,f(x1)=f(x1)/(x1-x2) ,x1-x3=f(x...https://blog.csdn.net/golden_xuhaifeng/article/details/79817330這兩篇文章也講述了牛頓法
liblinear
官方網站
LIBLINEAR -- A Library for Large Linear Classificationlogistic regression, support vector machines, linear classification, document classificationhttps://www.csie.ntu.edu.tw/~cjlin/liblinear/使用指南
https://www.csie.ntu.edu.tw/~cjlin/papers/liblinear.pdfhttps://www.csie.ntu.edu.tw/~cjlin/papers/liblinear.pdf是一個簡單的解決大規模線性化分類和回歸問題的軟件包
是具有數百萬個實例和特征的數據的線性分類器
sag
隨機梯度下降算法
saga
SAGA算法是SAG算法的一個加速版本
如何區分兩者
如何理解SAG,SVRG,SAGA三種優化算法 - 知乎最近在看Leon Bottou的大規模機器學習中的優化算法,發現里面有一些算法不太好理解,所以自己找了一些文章看了看,決定把SAG,SVRG,SAGA三種算法介紹一下。 對于這三種方法,我們主要目的是希望達到線性收斂的結果…https://zhuanlan.zhihu.com/p/51184012參數中與求解器(solver)相關的有
penalty,dual,intercept_scaling,max_iter
?1.2其他參數說明
| penalty | {'l1', 'l2', 'elasticnet', 'none'}, default='l2'
警告 某些懲罰可能不適用于某些求解器。請參閱參數?solver(求解器),以了解懲罰和求解器之間的兼容性。 |
| dual | 雙重或原始配方。對偶公式僅適用于使用 liblinear 求解器的 l2 懲罰。當 n_samples > n_features 時首選 dual=False。 |
| class_weight | dict or ‘balanced’, default=None “balanced”模式使用 y 的值自動調整與輸入數據中的類頻率成反比的權重 如果指定了 sample_weight,這些權重將與 sample_weight(通過 fit 方法傳遞)相乘 |
| max_iter | 默認=100 求解器收斂的最大迭代次數 |
| multi_class | {‘auto’, ‘ovr’, ‘multinomial’}, default=’auto’ 如果選擇的選項是“ovr”,那么每個標簽都適合一個二元問題。 對于“多項式”,最小化的損失是擬合整個概率分布的多項式損失,即使數據是二元的。 |
| random_state | 隨機種子 當solver== 'sag'、'saga' 或 'liblinear' 對數據進行洗牌時使用 |
| solver | {'newton-cg','lbfgs','liblinear','sag','saga'},默認 ='lbfgs' |
對于是否再邏輯回歸之前做歸一化或者標準化
scaler = StandardScaler() X_train = scaler.fit_transform(X)邏輯回歸模型中特征是否需要歸一化? - 簡書從前向過程來看:邏輯回歸模型的輸出是經過softmax的概率值,概率值的排序不受歸一化的影響。從另一個角度來看,softmax其實也就實現了歸一化的目的。 從反向過程來看:邏...https://www.jianshu.com/p/544c457a9947
二、優化方法(一下優化僅個人觀點)
2.1方法一,使用自編代碼求解權重,讓后將權重作為參數傳入
參數優化參考文獻
數據挖掘經典算法:Logistic(邏輯回歸) python和sklearn實現_昆蘭.沃斯 的博客-CSDN博客_sklearn 邏輯回歸Logistic雖然不是十大經典算法之一,但卻是數據挖掘中常用的有力算法,所以這里也專門進行了學習,以下內容皆為親自實踐后的感悟和總結(Logistic原理、代碼實現和優化、真實樣例數據、sklearn實現)。為了記錄的比較清楚,所以內容可能有點多,但都比較淺顯,下面進入正文。(運算數據來自機器學習第5章)Logistic原理:大體的思路:為了實現Logistic回歸分類器,我們可以在每個...https://blog.csdn.net/qq_36523839/article/details/81604217
import numpy as np import matplotlib.pyplot as plt import pandas as pd# 讀取文本數據,返回數據集和目標值 from sklearn import model_selection from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, roc_curve, auc from sklearn.preprocessing import StandardScalerdef loadDataSet():dataMat = []labelMat = []fr = open('testSet.txt')for line in fr.readlines():lineArr = line.strip().split()# 該數據集中,添加了一列并初始化為1,便于后續的計算,但是在其他數據集中,一般沒有必要添加dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])labelMat.append(int(lineArr[2]))return dataMat, labelMat# 運算的核心函數Sigmoid def sigmoid(inX):return 1.0 / (1 + np.exp(-inX))def stocGradAscent0(dataMatrix, classLabels):dataMatrix = np.array(dataMatrix) #將列表轉換格式m,n = np.shape(dataMatrix)alpha = 0.01weights = np.ones(n)for i in range(m):h = sigmoid(sum(dataMatrix[i]*weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i]return weightsdef stocGradAscent1(dataMatrix, classLabels, numIter=150):dataMatrix = np.array(dataMatrix) #將列表轉換格式m,n = np.shape(dataMatrix)weights = np.ones(n)for j in range(numIter):dataIndex = list(range(m))for i in range(m):alpha = 4/(1.0+j+i)+0.0001 #變化的alpharandIndex = int(np.random.uniform(0,len(dataIndex))) #隨機樣本下標h = sigmoid(sum(dataMatrix[randIndex]*weights))error = classLabels[randIndex] - hweights = weights + alpha * error * dataMatrix[randIndex]del(dataIndex[randIndex]) #從整個數據中去除已經使用過的樣本return weights# 核心函數alpha*gradient更新回歸系數 def gradAscent(dataMatIn, classLabels):# 為了便于計算,mat將兩個列表數據轉換為numpy的數組dataMatrix = np.mat(dataMatIn)labelMat = np.mat(classLabels).transpose() # transpose矩陣轉置m, n = np.shape(dataMatrix)alpha = 0.001 # 設置步長maxCycles = 500 # 設置循環次數weights = np.ones((n, 1)) # 初始化每個特征的回歸系數為1for k in range(maxCycles):# 得到每一行的sigmoid值 (兩個相乘得到z值)h = sigmoid(dataMatrix * weights) # 矩陣相乘 sigmoid(sum(每個特征*每個系數)) 行*列,由于是矩陣相乘,所以在相乘時便求和了# 用一直更新的回歸系數求預測值,然后與真實值之間求誤差,誤差越來越小,則系數更新變化也越來越小,最后趨于穩定error = (labelMat - h) # 每行分類與對應sigmoid相減 誤差值越來越小了# 數據集轉置*誤差 每條樣本*該樣本的誤差值weights = weights + alpha * dataMatrix.transpose() * errorreturn weights# 1.讀取訓練數據集 # 設置隨機種子 random_state_model = 40 filepath = r"文件路徑" #特征因子個數 feature_number = 特征個數 data = pd.read_excel(filepath) # reading file data = np.array(data) classifypointdata = data[:, 0:feature_number] classifypointlabel = data[:, -1]scaler = StandardScaler() classifypointdata = scaler.fit_transform(classifypointdata) # 切分數據,固定隨機種子(random_state)時,同樣的代碼,得到的訓練集數據相同。 # 此處運行完的結果可能是string類型之后用于計算時記得類型轉換 train_data, test_data, train_label, test_label = model_selection.train_test_split(classifypointdata, classifypointlabel, random_state=random_state_model,train_size=0.8, test_size=0.2) train_data = np.array(train_data) test_data = np.array(test_data) train_label = np.array(train_label) test_label = np.array(test_label) #dataArr, labelMat = loadDataSet() weights = gradAscent(train_data, train_label) print(weights) LC_model = LogisticRegression(random_state=random_state_model,class_weight=weights) LC_model.fit(train_data, train_label) y_test_pred = LC_model.predict(test_data) print("Accuracy %0.6f:" % (accuracy_score(test_label, y_test_pred))) y_test_predict_proba = LC_model.predict_proba(test_data)[:, 1] y_test_two_model = np.array(test_label, dtype=int) test_fpr, test_tpr, test_thresholds = roc_curve(y_test_two_model, y_test_predict_proba, pos_label=1) test_roc_auc = auc(test_fpr, test_tpr) print("auc %0.6f:" % (test_roc_auc))2.2方法二,綜合以上基于求解器我們使用網格搜索進行參數優化,其主要是優化的參數是solver,penalty,max_iter
import pandas as pd from sklearn import model_selection from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, roc_curve, auc from sklearn.model_selection import GridSearchCV from sklearn.preprocessing import StandardScaler import numpy as np # 1.讀取訓練數據集 # 設置隨機種子 random_state_model = 40 filepath = r"文件路徑" #特征因子個數 feature_number = 因子個數/特征值數 data = pd.read_excel(filepath) # reading file data = np.array(data) classifypointdata = data[:, 0:feature_number] classifypointlabel = data[:, -1] # 1.標準化處理 #標準差標準化(standardScale)使得經過處理的數據符合標準正態分布,即均值為0,標準差為1 #概念 #標準化:縮放和每個點都有關系,通過均值μ和標準差σ體現出來;輸出范圍是負無窮到正無窮 #優點 #提升模型的收斂速度 #提升模型的精度 #使用場景 #如果數據存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響 scaler = StandardScaler() classifypointdata = scaler.fit_transform(classifypointdata) # 切分數據,固定隨機種子(random_state)時,同樣的代碼,得到的訓練集數據相同。 # 此處運行完的結果可能是string類型之后用于計算時記得類型轉換 train_data, test_data, train_label, test_label = model_selection.train_test_split(classifypointdata, classifypointlabel, random_state=random_state_model,train_size=0.8, test_size=0.2)# 2.構建RF模型 #參數是基于個人數據優化的結果 LC_model = LogisticRegression(random_state=random_state_model) param_grid = [{'solver':['newton-cg'],'penalty':['l2','none'],'max_iter':[10,50,100,1000,2000]},{'solver':['lbfgs'],'penalty':['l2','none'],'max_iter':[10,50,100,1000,2000]},{'solver':['liblinear'],'penalty':['l2','l1'],'max_iter':[10,50,100,1000,2000]},{'solver':['sag'],'penalty':['l2','none'],'max_iter':[10,50,100,1000,2000]},{'solver':['saga'],'penalty':['l2','none','elasticnet','l1'],'max_iter':[10,50,100,1000,2000]}] LC_GSC = GridSearchCV(LC_model, param_grid, cv=10) LC_GSC.fit(train_data, train_label) print(LC_GSC.best_params_) print(LC_GSC.best_score_) optimal_LC = LC_GSC.best_params_LC_model = LogisticRegression(random_state=random_state_model,**optimal_LC) LC_model.fit(train_data, train_label)y_test_pred = LC_model.predict(test_data) print("Accuracy %0.6f:" % (accuracy_score(test_label, y_test_pred))) y_test_predict_proba = LC_model.predict_proba(test_data)[:, 1] y_test_two_model = np.array(test_label, dtype=int) test_fpr, test_tpr, test_thresholds = roc_curve(y_test_two_model, y_test_predict_proba, pos_label=1) test_roc_auc = auc(test_fpr, test_tpr) print("auc %0.6f:" % (test_roc_auc))2.3結果
兩者的auc是相同的,準確率相差0.05,但是方法一只相當于方法二的一部分
總結
以上是生活随笔為你收集整理的sklearn的逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 波音炒掉现任CEO!波音股价反而上涨了,
- 下一篇: 【转】什么是CT使用的水模、体模