逻辑回归是一种基本的分类技术。它属于线性分类器组,在某种程度上类似于多项式和线性回归。Logistic回归快速且相对简单,您可以方便地解释结果。尽管它本质上是二进制分类的一种方法,但是它也可以应用于多分类问题。
步骤1:导入包、函数和类
首先,我们必须导入Matplotlib进行可视化,并导入NumPy进行数组操作。我们还需要LogisticRegression、classification_report()、confusion_matrix()和scikit-learn。
步骤2:读取或导入数据
实际应用中,通常需要预先处理数据。今天的案例应用,我们仅创建输入(x)和输出(y)值的数组。需要指出的是,输入和输出应为NumPy数组(该类的实例numpy.ndarray)或相似的对象。numpy.arange()在给定范围内创建一个连续的,等间距值的数组。
步骤3:建立模型并训练模型
准备好输入和输出后,就可以创建和定义分类模型。您将使用该类的实例来表示它LogisticRegression。LogisticRegression并将其引用绑定到变量model。LogisticRegression有几个可选参数定义了模型和方法,可以参见相关Python书籍。
步骤4:评估模型
定义模型后,我们可以使用来检查其性能,使用函数predict_proba(),该模型会返回预测输出等于0或1的概率矩阵。
根据上述四个步骤,python代码如下:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
x = np.arange(10).reshape(-1, 1)
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
model = LogisticRegression(solver='liblinear', random_state=0)
model.fit(x, y)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='warn', n_jobs=None, penalty='l2',
random_state=0, solver='liblinear', tol=0.0001, verbose=0,
warm_start=False)
model = LogisticRegression(solver='liblinear', random_state=0).fit(x,y)
model.classes_
model.intercept_
model.predict_proba(x)
model.predict(x)
model.score(x, y)
print(classification_report(y, model.predict(x)))
步骤5:改善模型
我们可以通过设置不同的参数来改进模型。例如,可以使用C等于正则化强度10.0,而不是默认值1.0。
model = LogisticRegression(solver='liblinear', C=10.0, random_state=0)
model.fit(x, y)
运行上述代码后,我们得到另一个具有不同参数的模型。它还将具有不同的概率矩阵以及不同的系数和预测集。运行结果会发现:截距项和系数项的绝对值较大。之所以如此,是因为较大的值C意味着较弱的正则化,或与较高的系数和相关的惩罚较弱。
补充:
我们可以绘制可视化混淆矩阵,这通常很有用。我们可以使用.imshow()Matplotlib 来做到这一点,代码如下:
cm = confusion_matrix(y, model.predict(x))
fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(cm)
ax.grid(False)
ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted1s'))
ax.yaxis.set(ticks=(0, 1), ticklabels=('Actual 0s', 'Actual1s'))
ax.set_ylim(1.5, -0.5)
for i in range(2):
for j in range(2):
ax.text(j, i,cm[i, j], ha='center', va='center', color='red')
plt.show()