日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sklearn的逻辑回归

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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'

  • 'none':不加罰分;

  • 'l2': 添加一個 L2 懲罰項,它是默認選擇;

  • 'l1':增加一個L1懲罰項;

  • 'elasticnet': L1 和 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的逻辑回归的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。