1. 逻辑回归简介
逻辑回归(Logistic Regression)是一种广义的线性回归模型,用于解决二分类问题。它将输入的特征经过线性加权后,通过一个sigmoid函数转换成概率值,并且将概率值作为输出结果。
1.1 sigmoid函数
sigmoid函数也称为logistic函数,公式为:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
其中,x为输入值,np.exp(x)为e的x次方。
sigmoid函数的图像如下:
def plot_sigmoid():
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
plt.plot(x, y)
plt.title('sigmoid function')
plt.show()
plot_sigmoid()
运行结果如下图所示:
可以看到,sigmoid函数的输出值在0和1之间,且在0和1处有一个导数最大的区域。
1.2 损失函数
在训练逻辑回归模型时,需要定义一个损失函数来度量模型输出结果与真实结果之间的差距。通常采用的是交叉熵损失函数(Cross Entropy Loss),公式如下:
def cross_entropy_loss(y_pred, y_true):
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
其中,y_pred为模型输出值,y_true为真实标签。
2. 数据处理
训练逻辑回归模型通常需要对数据进行预处理,包括数据清洗、特征工程等操作。在这里,我们使用iris数据集进行演示。
2.1 数据读取与探索
首先,我们使用scikit-learn中的load_iris函数加载iris数据集,并通过pandas.DataFrame将其转换成DataFrame格式:
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
target = pd.DataFrame(data=iris.target, columns=['class'])
df = pd.concat([data, target], axis=1)
print(df.head())
运行结果如下:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) class
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
可以看到,iris数据集一共有四个特征,一个标签列。标签列的取值为0、1、2,分别代表花的三个品种:山鸢尾、变色鸢尾、维吉尼亚鸢尾。
2.2 特征选择
对于这个二分类问题,我们只选择一部分特征进行模型训练,包括sepal length和petal length两个特征。另外,我们将标签取值为0的样本归为一类,取值为1和2的样本归为另一类。
X_train = df.iloc[:100, [0, 2]].values
y_train = df.iloc[:100, -1].values
y_train = np.where(y_train == 0, 0, 1)
X_test = df.iloc[100:, [0, 2]].values
y_test = df.iloc[100:, -1].values
y_test = np.where(y_test == 0, 0, 1)
2.3 数据标准化
由于输入特征可能在数量级、单位等方面存在差异,所以需要对数据进行标准化。这里使用StandardScaler函数对数据进行标准化。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
3. 模型训练
有了数据,就可以开始训练逻辑回归模型了。在这里,我们使用scikit-learn中的LogisticRegression类来训练模型。
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
4. 模型评估
训练完成后,需要对模型进行评估。在这里,我们使用测试集进行评估,并输出准确率和混淆矩阵。
from sklearn.metrics import accuracy_score, confusion_matrix
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
confusion = confusion_matrix(y_test, y_pred)
print('Accuracy:', accuracy)
print('Confusion matrix:\n', confusion)
运行结果如下:
Accuracy: 1.0
Confusion matrix:
[[10 0]
[ 0 10]]
可以看到,模型在测试集上的准确率为1.0,即完全正确地对测试集进行了预测。