# _*_ coding: utf-8 _*_
# 开发团队:Mango
# 开发人员:md160
# 开发时间:13:06
# 文件名称:3.1Classify-dichotomy.py
# 开发工具:PyCharm
from sklearn.datasets import fetch_openml
import matplotlib.pyplot as plt
import numpy as np
# 获取MNIST数据集
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
# 这里加入as_frame=False是因为按书上写法后面步骤出现了问题:“查看数据集中的一个数字”显示不出来。
# 原因可能是:https://www.cnpython.com/qa/1394204
print(mnist.keys()) # 观察所有的键
# 查看MNIST数据集中的数组
X, y = mnist["data"], mnist["target"] # 将数据存入x,将标签存入y
print(X.shape)
print(y.shape)
# 查看数据集中的一个数字
some_digit = X[0]
some_digit_image = some_digit.reshape(28, 28)
plt.imshow(some_digit_image, cmap="binary")
plt.axis("off")
plt.show() # 查看数据集中的一个数字
print(y[0]) # 查看该数字的标签
# 将标签从字符格式转换成数字
y = y.astype(np.uint8)
# 划分 数据集和训练集 的数据及标签
X_train, y_train = X[:60000], y[:60000]
X_test, y_test = X[60000:], y[60000:]
# 添加一列预测标签
y_train_5 = (y_train == 5)
y_test_5 = (y_test == 5)
# 此时先创建一个SGDClassifier并在整个训练集上进行训练:
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42) # 定义1个SGDClassifier分类器,并设置参数random_state=42
# 因为SGDClassifier在训练时是完全随机的(因此得名“随机”),如果你希望得到可复现的结果,需要设置参数random_state。
sgd_clf.fit(X_train, y_train_5) # 用数据集去训练这个分类器
print(sgd_clf.predict([some_digit]))
from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone
# 使用交叉验证测量准确率
skfolds = StratifiedKFold(n_splits=3, shuffle=True, random_state=42) # 定义折叠的参数:3次,随机种子是42,确保可复现
# 原书程序运行时出错,提示说要加上shuffle=True
for train_index, test_index in skfolds.split(X_train, y_train_5):
# 每个折叠由StratifiedKFold执行分层抽样产生,其所包含的各个类的比例符合整体比例。
clone_clf = clone(sgd_clf) # 复制SGDClassifier分类器。每次迭代都创建一个副本,然后用测试集进行预测,每次互相不影响
X_train_folds = X_train[train_index] # 用迭代的train_index/test_index划分本次的数据集和测试集
y_train_folds = y_train_5[train_index]
X_test_fold = X_train[test_index]
y_test_fold = y_train_5[test_index]
clone_clf.fit(X_train_folds, y_train_folds) # 用数据训练副本分类器
y_pred = clone_clf.predict(X_test_fold) # 用分类器对本次的测试集进行预测
n_correct = sum(y_pred == y_test_fold)
print(n_correct / len(y_pred)) # 分别输出:0.9502, 0.96565, 0.96495
# 使用函数实现交叉验证
from sklearn.model_selection import cross_val_score
cross_val_score_result = cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring="accuracy")
print(cross_val_score_result)
# 定义非5识别函数:
from sklearn.base import BaseEstimator
class Never5Classifier(BaseEstimator):
def fit(self, X, y=None):
return self
def predict(self, X):
return np.zeros((len(X), 1), dtype=bool)
# 使用非5识别函数:
never_5_clf = Never5Classifier()
cross_val_score_result = cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring="accuracy")
print(cross_val_score_result)
from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3) # 得到交叉验证的训练结果
from sklearn.metrics import confusion_matrix
SGD_confusion_matrix = confusion_matrix(y_train_5, y_train_pred) # 获取混淆矩阵
print(SGD_confusion_matrix)
# 输出[53057, 1522],
# [1325, 4096]
# 输出精度\召回率和f1值
from sklearn.metrics import precision_score, recall_score
print(precision_score(y_train_5, y_train_pred))
print(recall_score(y_train_5, y_train_pred))
from sklearn.metrics import f1_score
print(f1_score(y_train_5, y_train_pred))
# 调用decision_function设置阈值进行判断
y_scores = sgd_clf.decision_function([some_digit]) # 返回some_digit的分数到y_scores里面
print(y_scores) # 输出:2164.22030239
threshold = 0 # 阈值设为0
y_some_digit_pred1 = (y_scores > threshold)
threshold = 8000 # 阈值设为8000
y_some_digit_pred2 = (y_scores > threshold)
print(y_some_digit_pred1, '\n', y_some_digit_pred2) # 分别输出True和False
# 判断使用什么阈值更合适
y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function") # 获取训练集中所有实例的分数
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores) # 计算所有可能的阈值下的精度和召回率
# precision_recall_curve计算不同概率阈值的精确召回对(注意:此实现仅限于二进制分类任务),分别返回precisions, recalls, thresholds
# 绘制精度和召回率相对于阈值的函数图
import matplotlib as mpl
def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
plt.style.use('seaborn') # 指定绘画风格
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 指定字体为SimHei,用于显示中文,如果Ariel,中文会乱码
mpl.rcParams["axes.unicode_minus"] = False # 用来正常显示负号
plt.plot(thresholds, precisions[:-1], "b--", label="Precision") # 一条阈值-精度曲线
plt.plot(thresholds, recalls[:-1], "g-", label="Recall") # 一条阈值-召回率曲线
plt.xlabel('阈值', fontsize=20) # 添加x坐标轴标签
plt.legend(fontsize=18) # 加图例
plot_precision_recall_vs_threshold(precisions, recalls, thresholds)
plt.show()
# 绘制Precision-Recall曲线
from sklearn.metrics import PrecisionRecallDisplay
pr_display = PrecisionRecallDisplay(precision=precisions, recall=recalls).plot()
plt.show()
threshold_90_precision = thresholds[np.argmax(precisions >= 0.90)]
print(threshold_90_precision) # 输出:3370.0194991439557
y_train_pred_90 = (y_scores >= threshold_90_precision)
print(y_train_pred_90)
y_train_pred_90_p_score = precision_score(y_train_5, y_train_pred_90)
y_train_pred_90_r_score = recall_score(y_train_5, y_train_pred_90)
print('精度:', y_train_pred_90_p_score, '\n', '召回率:', y_train_pred_90_r_score)
# 使用roc_curve()函数计算多种阈值的TPR和FPR
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
# 使用Matplotlib绘制FPR对TPR的曲线。
def plot_roc_curve(fpr, tpr, label=None):
plt.style.use('seaborn') # 指定绘画风格
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 指定字体为SimHei,用于显示中文,如果Ariel,中文会乱码
mpl.rcParams["axes.unicode_minus"] = False # 用来正常显示负号
plt.plot(fpr, tpr, linewidth=2, label=label)
plt.plot([0, 1], [0, 1], 'k--') # Dashed diagonal
plt.xlabel('假正率', fontsize=18) # 添加x坐标轴标签
plt.ylabel('真正率(召回率)', fontsize=18) # 添加x坐标轴标签
plot_roc_curve(fpr, tpr)
plt.show()
from sklearn.metrics import roc_auc_score
roc_auc_score_forSGD = roc_auc_score(y_train_5, y_scores)
print(roc_auc_score_forSGD)
# 测试随机森林模型的ROC和AUC
from sklearn.ensemble import RandomForestClassifier
forest_clf = RandomForestClassifier(random_state=42) # 定义1个随机森林分类器
y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3, method="predict_proba") # 交叉验证
# roc_curve()函数需要标签和分数,但是我们�
没有合适的资源?快使用搜索试试~ 我知道了~
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-个人学习笔记及代码
共3个文件
py:2个
md:1个
需积分: 49 10 下载量 110 浏览量
2022-04-02
23:53:20
上传
评论
收藏 22KB ZIP 举报
温馨提示
学习时的笔记及相关代码,笔记可见:https://blog.csdn.net/Morganfs/article/details/123926929?spm=1001.2014.3001.5501 学习来源:Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron (O’Reilly). Copyright 2019 Aurélien Géron, 978-1-492-03264-9.
资源详情
资源评论
资源推荐
收起资源包目录
3.Classification.zip (3个子文件)
3.1Classify-dichotomy.py 9KB
3.分类.md 41KB
3.2Classify-multi.py 6KB
共 3 条
- 1
新四石路打卤面
- 粉丝: 643
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 光伏储能三相PQ恒功率并网控制仿真(附参考文献及文档) ①网侧:采用PQ恒功率控制 参考文献《-微电网及其逆变器控制技术的研究》
- 基于A*算法与三阶贝塞尔曲线的驾校自动驾驶路径规划设计源码
- 基于Java实现的仿朋友圈九宫格设计源码
- 光伏储能三相PQ恒功率并网控制仿真(附参考文献及文档) ①网侧:采用PQ恒功率控制,参考文献《-微电网及其逆变器控制技术的研究》
- 基于SpringBoot+Vue的安康旅游网站设计源码
- Matlab Simulink电气工程仿真分析,电力电子变技术中的光伏全桥逆变器、SVC无功补偿、不间断电源UPS、高压直流输电
- 基于Java、JavaScript、CSS的网吧会员管理系统设计源码
- MATLAB六自由度齿轮弯扭耦合动力学代码(考虑时变啮合刚度、齿侧间隙),根据集中质量法建模(含数学方程建立和公式推导)并在MA
- 基于SSM框架的OA报销系统设计源码
- 基于Python和Shell的个性化PC环境初始化脚本设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0