笔者邀请您,先思考:
1逻辑回归算法怎么理解?
2 如何用Python平台做逻辑回归?
logistic回归是一种机器学习分类算法,用于预测分类因变量的概率。 在逻辑回归中,因变量是一个二进制变量,包含编码为1(是,成功等)或0(不,失败等)的数据。 换句话说,逻辑回归模型基于X的函数预测P(Y = 1)。
记住上述假设,让我们看一下我们的数据集。
该数据集来自UCI机器学习库,它与葡萄牙银行机构的直接营销活动(电话)有关。 分类目标是预测客户是否将订阅(1/0)到定期存款(变量y)。 数据集可以从这里下载。
import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font", size = 4)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid", color_codes=True)
数据集提供银行客户的信息。 它包括41,188条记录和21个字段。
data = pd.read_csv("raw_data/banking.csv", header=0)
data = data.dropna()
print(data.shape)
print(list(data.columns))
y - 客户是否订购了定期存款? (二进制:“1”表示“是”,“0”表示“否”)
sns.countplot(x = 'y', data=data, palette="hls")
plt.show()
如下图:
print(data.isnull().sum())
sns.countplot(y = "job", data=data)
plt.show()
如下图:
sns.countplot(x = "marital", data=data)
plt.show()
如下图:
sns.countplot(x="default", data=data)
plt.show()
如下图:
sns.countplot(x="housing", data=data)
plt.show()
如下图:
sns.countplot(x="loan", data=data)
plt.show()
如下图:
sns.countplot(x="poutcome", data=data)
plt.show()
如下图:
我们的预测将基于客户的工作,婚姻状况,他(她)是否有违约信用,他(她)是否有住房贷款,他(她)是否有个人贷款,以及之前营销的结果活动。 因此,我们将删除不需要的变量。
data.drop(data.columns[[0, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]], axis=1, inplace=True)
创建虚拟变量,即只有两个值的变量,零和一。 在逻辑回归模型中,将所有自变量编码为虚拟变量使得容易地解释和计算odds比,并且增加系数的稳定性和显着性。
data2 = pd.get_dummies(data, columns =['job', 'marital', 'default', 'housing', 'loan', 'poutcome'])
print(data2.columns)
data2.drop(data2.columns[[12, 16, 18, 21, 24]], axis=1, inplace=True)
print(data2.columns)
完美! 正是我们后续步骤的需求。
sns.heatmap(data2.corr())
plt.show()
看起来不错。
X = data2.iloc[:,1:]
y = data2.iloc[:,0]
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
print(X_train.shape)
(30891, 23)
很好! 现在我们可以开始构建逻辑回归模型。
classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train)
confusion_matrix()函数将计算混淆矩阵并将结果以数组返回。
y_pred = classifier.predict(X_test)
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)
结果告诉我们,我们有9046 + 229个正确的预测和912 + 110个不正确的预测。
print('Accuracy of logistic regression classifier on test set: {:.2f}'.format(classifier.score(X_test, y_test)))
Accuracy of logistic regression classifier on test set: 0.90
本节的目的是可视化逻辑回归类规则器的决策边界。 为了更好地对决策边界进行可视化,我们将对数据执行主成分分析(PCA),以将维度降低到2维。
from sklearn.decomposition import PCA
X = data2.iloc[:,1:]
y = data2.iloc[:,0]
pca = PCA(n_components=2).fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(pca, y, random_state=0)
plt.figure(dpi=120)
plt.scatter(pca[y.values==0,0], pca[y.values==0,1], alpha=0.5, label='YES', s=2, color='navy')
plt.scatter(pca[y.values==1,0], pca[y.values==1,1], alpha=0.5, label='NO', s=2, color='darkorange')
plt.legend()
plt.title('Bank Marketing Data Set\nFirst Two Principal Components')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.gca().set_aspect('equal')
plt.show()
如下图:
def plot_bank(X, y, fitted_model):
plt.figure(figsize=(9.8,5), dpi=100)
for i, plot_type in enumerate(['Decision Boundary', 'Decision Probabilities']):
plt.subplot(1,2,i+1)
mesh_step_size = 0.01 # step size in the mesh
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
xx, yy = np.meshgrid(np.arange(x_min, x_max, mesh_step_size), np.arange(y_min, y_max, mesh_step_size))
if i == 0:
Z = fitted_model.predict(np.c_[xx.ravel(), yy.ravel()])
else:
try:
Z = fitted_model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
except:
plt.text(0.4, 0.5, 'Probabilities Unavailable', horizontalalignment='center',
verticalalignment='center', transform = plt.gca().transAxes, fontsize=12)
plt.axis('off')
break
Z = Z.reshape(xx.shape)
plt.scatter(X[y.values==0,0], X[y.values==0,1], alpha=0.8, label='YES', s=5, color='navy')
plt.scatter(X[y.values==1,0], X[y.values==1,1], alpha=0.8, label='NO', s=5, color='darkorange')
plt.imshow(Z, interpolation='nearest', cmap='RdYlBu_r', alpha=0.15,
extent=(x_min, x_max, y_min, y_max), origin='lower')
plt.title(plot_type + '\n' +
str(fitted_model).split('(')[0]+ ' Test Accuracy: ' + str(np.round(fitted_model.score(X, y), 5)))
plt.gca().set_aspect('equal');
plt.tight_layout()
plt.legend()
plt.subplots_adjust(top=0.9, bottom=0.08, wspace=0.02)
model = LogisticRegression()
model.fit(X_train,y_train)
plot_bank(X_test, y_test, model)
plt.show()
如下图:
如您所见,PCA降低了Logistic回归模型的准确性。 这是因为我们使用PCA来减少维度,因此我们从数据中删除了信息。 我们将在以后的帖子中介绍PCA。 用于制作此文章的Jupyter笔记本可在此处获得。 我很乐意收到有关上述任何内容的反馈或问题。
作者:Susan Li 原文链接: https://datascienceplus.com/building-a-logistic-regression-in-python-step-by-step/
版权声明:作者保留权利,严禁修改,转载请注明原文链接。