📜  毫升 |使用Python进行逻辑回归

📅  最后修改于: 2022-05-13 01:54:44.913000             🧑  作者: Mango

毫升 |使用Python进行逻辑回归

先决条件:了解逻辑回归
用户数据库——该数据集包含来自公司数据库的用户信息。它包含有关用户 ID、性别、年龄、EstimatedSalary、已购买的信息。我们使用这个数据集来预测用户是否会购买公司新推出的产品。
数据 – User_Data

让我们建立逻辑回归模型,预测用户是否会购买产品。
输入库

Python3
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


Python3
dataset = pd.read_csv('...\\User_Data.csv')


Python3
# input
x = dataset.iloc[:, [2, 3]].values
 
# output
y = dataset.iloc[:, 4].values


Python3
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(
        x, y, test_size = 0.25, random_state = 0)


Python3
from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
xtrain = sc_x.fit_transform(xtrain)
xtest = sc_x.transform(xtest)
 
print (xtrain[0:10, :])


Python3
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(xtrain, ytrain)


Python3
y_pred = classifier.predict(xtest)


Python3
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(ytest, y_pred)
 
print ("Confusion Matrix : \n", cm)


Python3
from sklearn.metrics import accuracy_score
print ("Accuracy : ", accuracy_score(ytest, y_pred))


Python3
from matplotlib.colors import ListedColormap
X_set, y_set = xtest, ytest
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1,
                               stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1,
                               stop = X_set[:, 1].max() + 1, step = 0.01))
 
plt.contourf(X1, X2, classifier.predict(
             np.array([X1.ravel(), X2.ravel()]).T).reshape(
             X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green')))
 
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
 
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
     
plt.title('Classifier (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()


加载数据集 – User_Data

Python3

dataset = pd.read_csv('...\\User_Data.csv')

现在,要预测用户是否会购买产品,需要找出年龄和预估薪水之间的关系。在这里,用户 ID 和性别不是找出这一点的重要因素。

Python3

# input
x = dataset.iloc[:, [2, 3]].values
 
# output
y = dataset.iloc[:, 4].values

拆分数据集以进行训练和测试。 75% 的数据用于训练模型,25% 用于测试我们模型的性能。

Python3

from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(
        x, y, test_size = 0.25, random_state = 0)

现在,在这里执行特征缩放非常重要,因为 Age 和 Estimated Salary 值位于不同的范围内。如果我们不对特征进行缩放,那么当模型在数据空间中找到与数据点最近的邻居时,估计薪水特征将主导年龄特征。

Python3

from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
xtrain = sc_x.fit_transform(xtrain)
xtest = sc_x.transform(xtest)
 
print (xtrain[0:10, :])

输出 :

[[ 0.58164944 -0.88670699]
 [-0.60673761  1.46173768]
 [-0.01254409 -0.5677824 ]
 [-0.60673761  1.89663484]
 [ 1.37390747 -1.40858358]
 [ 1.47293972  0.99784738]
 [ 0.08648817 -0.79972756]
 [-0.01254409 -0.24885782]
 [-0.21060859 -0.5677824 ]
 [-0.21060859 -0.19087153]]

这里曾经看到 Age 和 Estimated Salary 特征值被删除,现在在 -1 到 1 之间。因此,每个特征都将在决策制定中做出同等贡献,即最终确定假设。
最后,我们正在训练我们的逻辑回归模型。

Python3

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(xtrain, ytrain)

在训练模型之后,是时候使用它对测试数据进行预测了。

Python3

y_pred = classifier.predict(xtest)

让我们测试一下我们模型的性能——混淆矩阵

Python3

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(ytest, y_pred)
 
print ("Confusion Matrix : \n", cm)

输出 :

Confusion Matrix : 
 [[65  3]
 [ 8 24]]

满分 100 :
真阳性 + 真阴性 = 65 + 24
假阳性 + 假阴性 = 3 + 8
绩效衡量——准确性

Python3

from sklearn.metrics import accuracy_score
print ("Accuracy : ", accuracy_score(ytest, y_pred))

输出 :

Accuracy :  0.89

可视化我们模型的性能。

Python3

from matplotlib.colors import ListedColormap
X_set, y_set = xtest, ytest
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1,
                               stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1,
                               stop = X_set[:, 1].max() + 1, step = 0.01))
 
plt.contourf(X1, X2, classifier.predict(
             np.array([X1.ravel(), X2.ravel()]).T).reshape(
             X1.shape), alpha = 0.75, cmap = ListedColormap(('red', 'green')))
 
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
 
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
     
plt.title('Classifier (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

输出 :

分析性能指标——准确度和混淆矩阵以及图表,我们可以清楚地说我们的模型表现得非常好。