# 【机器学习】SoftMax多分类

## 练习题：红酒产地预测

rwine = load_wine()  # 导入红酒数据
X = rwine.data
y = rwine.target
m, n = X.shape
y = convert_to_vectors(y)
X = np.concatenate((np.ones((m, 1)), X), axis=1)

# 正则化，原因是e = np.exp(scores)会溢出，将x正则化[]
X = normalize(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 使用自定义的SoftMax回归模型
model = SoftmaxRegression()
model.fit(X_train, y_train)
model.predict(X_test)
y_score = model.proba
y_true = max_indices = np.argmax(y_test, axis=1)
# 精确率计算
def t_pre(y_pre, y_true):
count = 0
for i in range(len(y_pre)):
if y_pre[i] - y_true[i] == 0:
count += 1
return count
acc = (t_pre(np.argmax(model.proba, axis=1), y_true)) / len(y_true)
print(acc)

# 绘制ROC曲线：调用skelearn库中方法
# 将每个标签作为正例，其他两个标签合并作为负例，计算ROC曲线和AUC值
fpr, tpr, roc_auc = {}, {}, {}
for i in range(3):
fpr[i], tpr[i], _ = roc_curve(y_true == i, y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
plt.figure()
colors = ['red', 'green', 'blue']
labels = ['Class A', 'Class B', 'Class C']
for i in range(3):
plt.plot(fpr[i], tpr[i], color=colors[i], lw=2,
label='{0} (AUC = {1:0.2f})'
''.format(labels[i], roc_auc[i]))
plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.legend(loc="lower right")
plt.show()

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc, accuracy_score
import matplotlib.pyplot as plt
import numpy as np
def normalize(X):
X_min = np.min(X, axis=0)
X_max = np.max(X, axis=0)
print(X_max)
denom = X_max - X_min
# 将所有分母为零的元素置为一个小值
denom[denom == 0] = 1e-8
return (X - X_min) / denom
def softmax(scores):
e = np.exp(scores)
s = e.sum(axis=1)
for i in range(len(s)):
e[i] /= s[i]
return e
def threshold(t, proba):
return (proba >= t).astype(np.int)
def plot_roc_curve(proba, y):
fpr, tpr = [], []
for i in range(100):
z = threshold(0.01 * i, proba)
tp = (y * z).sum()
fp = ((1 - y) * z).sum()
tn = ((1 - y) * (1 - z)).sum()
fn = (y * (1 - z)).sum()
fpr.append(1.0 * fp / (fp + tn))
tpr.append(1.0 * tp / (tp + fn))
plt.plot(fpr, tpr)
plt.show()
class SoftmaxRegression:
def __init__(self):
self.w = None
self.proba = None
def fit(self, X, y, eta_0=50, eta_1=100, N=1000):
m, n = X.shape
m, k = y.shape
w = np.zeros(n * k).reshape(n, k)
if self.w is None:
self.w = np.zeros(n * k).reshape(n, k)
for t in range(N):
i = np.random.randint(m)
x = X[i].reshape(1, -1)
print(x.dot(w))
proba = softmax(x.dot(w))
g = x.T.dot(proba - y[i])
w = w - eta_0 / (t + eta_1) * g
self.w += w
self.w /= N
def predict_proba(self, X):
return softmax(X.dot(self.w))
def predict(self, X):
self.proba = self.predict_proba(X)
return np.argmax(self.proba, axis=1)
def convert_to_vectors(c):  # 转换成 m*k 矩阵(one-hot向量)， m样本数，k类别数
# c为类标签列向量 m*1，c[i]{0,1,..,k-1}
m = len(c)
k = np.max(c) + 1
y = np.zeros(m * k).reshape(m, k)
for i in range(m):
y[i][c[i]] = 1  # y[i]的第c[i]位置1，其余位为0
return y
X = rwine.data
y = rwine.target
m, n = X.shape
y = convert_to_vectors(y)
X = np.concatenate((np.ones((m, 1)), X), axis=1)
# 正则化，原因是e = np.exp(scores)会溢出，将x正则化[]
X = normalize(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 使用自定义的SoftMax回归模型
model = SoftmaxRegression()
model.fit(X_train, y_train)
model.predict(X_test)
y_score = model.proba
y_true = max_indices = np.argmax(y_test, axis=1)
# 精确率计算
def t_pre(y_pre, y_true):
count = 0
for i in range(len(y_pre)):
if y_pre[i] - y_true[i] == 0:
count += 1
return count
acc = (t_pre(np.argmax(model.proba, axis=1), y_true)) / len(y_true)
print(acc)
# 绘制ROC曲线：调用skelearn库中方法
# 将每个标签作为正例，其他两个标签合并作为负例，计算ROC曲线和AUC值
fpr, tpr, roc_auc = {}, {}, {}
for i in range(3):
fpr[i], tpr[i], _ = roc_curve(y_true == i, y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
plt.figure()
colors = ['red', 'green', 'blue']
labels = ['Class A', 'Class B', 'Class C']
for i in range(3):
plt.plot(fpr[i], tpr[i], color=colors[i], lw=2,
label='{0} (AUC = {1:0.2f})'
''.format(labels[i], roc_auc[i]))
plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.legend(loc="lower right")
plt.show()

ROC曲线：对于多分类的ROC曲线的绘制，可以分别将各个类别作为正例，其他类别作为反例，最后可以取平均AUC值作为该模型的AUC值

|
22天前
|

【人工智能】机器学习、分类问题和逻辑回归的基本概念、步骤、特点以及多分类问题的处理方法

19 1
|
1月前
|

【机器学习】简单解释贝叶斯公式和朴素贝叶斯分类？(面试回答)

50 1
|
18天前
|

11 0
|
1月前
|

【NLP】讯飞英文学术论文分类挑战赛Top10开源多方案–4 机器学习LGB 方案

21 0
|
3月前
|

【机器学习】Softmax回归探索
【机器学习】Softmax回归探索
86 8
|
3月前
|

【6月更文挑战第14天】机器学习方法分类。
44 2
|
3月前
|

【6月更文挑战第28天】在机器学习项目中，选择算法涉及问题类型识别（如回归、分类、聚类、强化学习）、数据规模与特性（大数据可能适合分布式算法或深度学习）、性能需求（准确性、速度、可解释性）、资源限制（计算与内存）、领域知识应用以及实验验证（交叉验证、模型比较）。迭代过程包括数据探索、模型构建、评估和优化，结合业务需求进行决策。
39 0
|
4月前
|

86 1
|
3月前
|

【机器学习】逻辑回归：智能垃圾邮件分类实例
【机器学习】逻辑回归：智能垃圾邮件分类实例
119 0
|
3月前
|

【机器学习】Voting集成学习算法：分类任务中的新利器
【机器学习】Voting集成学习算法：分类任务中的新利器
64 0