下面我将为你详细讲解如何使用TensorFlow实现Logistic回归。
1. Logistic回归简介
Logistic回归是一种二分类的机器学习方法,在传统的回归方法的基础上引入了sigmoid函数对输出进行二分类。sigmoid函数的取值范围为0到1,可以看作是对线性函数的非线性变换,将线性输出映射到0-1之间,代表着概率值。当sigmoid函数的输出大于0.5时,输入被分类为正例,小于0.5时则被分类为负例。在实际应用中,我们通常将sigmoid函数的输出阈值设为0.5。
2. 实现步骤
2.1 数据预处理
首先,我们需要进行数据预处理,即将原始的数据转化为计算机可以读取的格式。在这里,我们以鸢尾花数据集为例,数据集中每个样本有4个特征,分别为花萼长度、花萼宽度、花瓣长度、花瓣宽度,共150个样本。将数据集划分为训练集和测试集,其中训练集占70%,测试集占30%。
import tensorflow as tf
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载数据集
iris = load_iris()
# 特征和标签
X = iris["data"][:, (2, 3)] # 取花瓣长度和花瓣宽度
y = (iris["target"] == 2).astype(int) # 二分类,鸢尾花为Virginica设为1,其余设为0
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
以上代码利用了sklearn库中的函数,进行数据集的载入、数据划分和特征缩放等预处理操作。
2.2 模型定义
接着,我们需要定义一个Logistic回归模型。在TensorFlow中,我们可以通过定义一个计算图来定义模型。
# 定义模型
n_features = X_train.shape[1] # 特征数
X = tf.placeholder(dtype=tf.float32, shape=[None, n_features])
y = tf.placeholder(dtype=tf.float32, shape=[None])
w = tf.Variable(tf.random_normal(shape=[n_features, 1]))
b = tf.Variable(tf.zeros([1]))
z = tf.add(tf.matmul(X, w), b)
y_pred = tf.sigmoid(z)
以上代码中,我们首先定义了两个占位符,分别是输入特征和标签。然后定义了模型的参数w和b,并通过矩阵乘法和加法运算计算出了模型的输出y_pred。
2.3 损失函数和优化器
接下来,我们需要定义损失函数和优化器。在Logistic回归中,我们使用的是二元交叉熵损失函数,可以通过TensorFlow中的sigmoid_cross_entropy_with_logits()函数来实现。优化器我们使用的是梯度下降法,可以选择使用TensorFlow中的GradientDescentOptimizer()函数。
# 定义损失函数和优化器
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=z))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(loss)
以上代码中,我们使用了TensorFlow中的reduce_mean()来计算损失函数,并使用GradientDescentOptimizer()来定义优化器。train_op是训练操作,通过优化器对损失函数进行优化。
2.4 模型训练和预测
最后,我们需要进行模型的训练和预测。在这里,我们将训练操作train_op和模型的预测结果y_pred传入session.run()函数中,进行模型的训练和预测。
# 创建会话
with tf.Session() as sess:
# 初始化模型参数
sess.run(tf.global_variables_initializer())
# 训练模型
for epoch in range(1000):
_, loss_value = sess.run([train_op, loss], feed_dict={X: X_train_scaled, y: y_train})
if epoch % 100 == 0:
print("Epoch: {}, Loss: {:.4f}".format(epoch, loss_value))
# 预测
y_pred_proba = sess.run(y_pred, feed_dict={X: X_test_scaled})
y_pred = (y_pred_proba >= 0.5).astype(int)
# 计算准确率
accuracy = (y_pred == y_test).mean()
print("Accuracy:", accuracy)
在上面代码中,我们首先创建了会话,并使用global_variables_initializer()函数来初始化模型参数。然后进行模型的训练,通过session.run()函数运行训练操作train_op和损失函数loss,feed_dict参数用来传递训练数据。最后,我们对测试集进行预测,并计算准确率。
3. 示例说明
上述代码中我们以鸢尾花数据集为例,将数据集划分为训练集和测试集,训练集占70%,测试集占30%。我们利用sklearn库中的函数对数据进行预处理操作,包括数据标准化、数据划分等。接着我们定义了一个Logistic回归模型,包含输入特征、标签、参数w、参数b以及模型预测值y_pred,使用sigmoid函数作为非线性激活函数。然后我们定义了一个梯度下降优化器和二元交叉熵损失函数,将其传入train_op和loss。接着我们通过session.run()函数进行模型的训练和预测,输出模型的准确率。通过以上几个步骤可以实现一个基本的Logistic回归模型。
另外一点,可以通过对不同数据集的实验,更好的理解Logistic回归及TensorFlow的使用。管道较多,容易产生错误,\为了让用户更好地学习,获得更多的反馈,可以将模型的建立、数据预处理、模型训练和测试部分分别介绍,并适时提示一些错误排除方法更好。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TensorFlow实现Logistic回归 - Python技术站