[英]Is there a way to ensemble multiple logistic regression equations into one?
我正在研究二進制分類問題,其中響應率(不良)小於1%。 預測變量包括一組名義上的分類變量和連續變量。
最初,我嘗試了一種過采樣技術(SMOTE)以平衡這兩個類別。 對過采樣的數據集執行Logistic回歸可得到良好的整體准確性,但假陽性率非常高。
我現在計划進行欠采樣並運行多個邏輯回歸模型。 我正在處理的基本python代碼如下。 在將這些多個邏輯回歸模型的結果整合為一個時需要指導。
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
#Set i for the number of equations required
for i in range(10):
#Create a sample of goods, good is pandas df containing goods
sample_good=good.sample(n=300,replace=True)
#Create a sample of bads, bad is pandas df containing bads. There are
#only 100 bads in the dataset
sample_bad=bad.sample(n=100,replace=True)
#Append the good and bad sample
sample=sample_good.append(sample_bad)
X = sample.loc[:, sample.columns != 'y']
y = sample.loc[:, sample.columns == 'y']
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print('Accuracy of logistic regression classifier on test set:
{:.2f}'.format(logreg.score(X_test, y_test)))
上面的for循環運行10次,並構建10個不同的模型。 需要將這10個模型整合為一個模型的指導。 我已經閱讀了諸如裝袋等可用技術的信息。在這種情況下,由於響應率非常低,因此我創建的示例每次都需要具有所有不利條件。
我認為您應該使用scikit-learn的BaggingClassifier。 簡而言之,它適用於您數據的隨機子樣本中的多個分類器,然后讓它們投票執行分類。 該元估計器會優雅地阻止您編寫for循環。 至於采樣(我相信這是您編寫循環的原始動機),您可以在model.fit()方法中調整權重。
import numpy as np
from sklearn.ensemble import BaggingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import balanced_accuracy_score
breast_cancer = datasets.load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X,y)
如您所見,數據集是不平衡的(畢竟,它是醫學數據):
len(y_train[y_train == 0]),len(y_train[y_train == 1]) # 163, 263
因此,讓我們添加樣本權重
y0 = len(y_train[y_train == 0])
y1 = len(y_train[y_train == 1])
w0 = y1/y0
w1 = 1
sample_weights = np.zeros(len(y_train))
sample_weights[y_train == 0] = w0
sample_weights[y_train == 1] = w1
現在,BaggingClassifier:
model = BaggingClassifier(LogisticRegression(solver = 'liblinear'),
n_estimators=10,
bootstrap = True, random_state = 2019)
model.fit(X,y,sample_weights)
balanced_accuracy_score(y_test,model.predict(X_test)) # 94.2%
請注意,如果我不適合樣本權重,則平衡精度僅為92.1%(平衡精度=平均召回率,對於不平衡問題非常有用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.