机器学习中的 Softmax 分类器是一种常用的多分类模型,它将逻辑回归(Logistic Regression)推广到多分类问题中。在 Softmax 分类器中,我们使用一个二维平面(或多维空间中的超平面)来将不同类别的数据分开。这个超平面由一个线性函数决定,该线性函数可以表示为:y = w1 x1 + w2 x2 +... + wn * xn 其中,y 是输出变量(通常为类别的概率向量),x1, x2,..., xn 是输入变量,w1, w2,..., wn 是需要学习的权重。
Softmax 分类器的主要优点是它可以处理多维输入变量和多类别输出变量之间的关系。这使得它在许多实际应用场景中具有很好的表现,例如图像分类、文本分类等。
要使用 Softmax 分类器,可以按照以下步骤进行:
- 收集数据:收集包含输入变量和输出变量的数据集。这些数据可以是实验室测量值、历史数据或现实世界中的观测值。
- 数据预处理:处理数据中的异常值、缺失值,并将连续变量标准化(例如归一化)以提高模型性能。
- 划分数据集:将数据集划分为训练集和测试集。训练集用于训练模型,而测试集用于评估模型性能。
- 训练模型:使用训练集数据,通过最小化代价函数(如交叉熵损失,Cross-Entropy Loss)来调整模型参数(权重)。
- 评估模型:使用测试集数据,评估模型的性能。如果性能不佳,可以调整学习率、迭代次数等超参数,或尝试使用其他模型。
- 应用模型:将训练好的模型应用于新数据,进行预测。
总之,Softmax 分类器是一种用于解决多分类问题的机器学习模型,通过拟合一个二维平面(或多维空间中的超平面),将不同类别的数据分开。通过收集数据、预处理数据、划分数据集、训练模型、评估模型和应用模型等步骤,我们可以使用 Softmax 分类器来预测连续值和解决分类问题。
Ch 04: Concept 01
Linear regression for classification (just for demonstrative purposes)
Import the usual libraries:
%matplotlib inline
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
Let's say we have numbers that we want to classify. They'll just be 1-dimensional values. Numbers close to 5 will be given the label [0], and numbers close to 2 will be given the label [1], as designed here:
x_label0 = np.random.normal(5, 1, 10)
x_label1 = np.random.normal(2, 1, 10)
xs = np.append(x_label0, x_label1)
labels = [0.] * len(x_label0) + [1.] * len(x_label1)
plt.scatter(xs, labels)
<matplotlib.collections.PathCollection at 0x7f5be2699fd0>
Define the hyper-parameters, placeholders, and variables:
learning_rate = 0.001
training_epochs = 1000
X = tf.placeholder("float")
Y = tf.placeholder("float")
w = tf.Variable([0., 0.], name="parameters")
Define the model:
def model(X, w):
return tf.add(tf.multiply(w[1], tf.pow(X, 1)),
tf.multiply(w[0], tf.pow(X, 0)))
Given a model, define the cost function:
y_model = model(X, w)
cost = tf.reduce_sum(tf.square(Y-y_model))
Set up the training op, and also introduce a couple ops to calculate some metrics, such as accuracy:
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
correct_prediction = tf.equal(Y, tf.to_float(tf.greater(y_model, 0.5)))
accuracy = tf.reduce_mean(tf.to_float(correct_prediction))
Prepare the session:
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
Run the training op multiple times on the input data:
for epoch in range(training_epochs):
sess.run(train_op, feed_dict={X: xs, Y: labels})
current_cost = sess.run(cost, feed_dict={X: xs, Y: labels})
if epoch % 100 == 0:
print(epoch, current_cost)
0 8.63226
100 3.23953
200 2.14632
300 1.90881
400 1.8572
500 1.84599
600 1.84356
700 1.84303
800 1.84291
900 1.84289
Show some final metrics/results:
w_val = sess.run(w)
print('learned parameters', w_val)
print('accuracy', sess.run(accuracy, feed_dict={X: xs, Y: labels}))
sess.close()
learned parameters [ 1.28786051 -0.25033307]
accuracy 0.95
Plot the learned function
all_xs = np.linspace(0, 10, 100)
plt.plot(all_xs, all_xs*w_val[1] + w_val[0])
plt.scatter(xs, labels)
plt.show()