厦门网站推广¥做下拉去118cr,抖音seo是什么意思,网站开发 土木,开源网站 做镜像 如何做IDE为Jupyter Notebook scikit-learn官网 scikit-learn是一个专门用于机器学习的工具包 运用到啥函数不知道咋使用#xff1f;戳它–scikit-learn工具包的API文档 不知道用啥模板#xff1f;戳它–scikit-learn样例模型
功能翻译Classification分类Regression回归Cl…IDE为Jupyter Notebook scikit-learn官网 scikit-learn是一个专门用于机器学习的工具包 运用到啥函数不知道咋使用戳它–scikit-learn工具包的API文档 不知道用啥模板戳它–scikit-learn样例模型
功能翻译Classification分类Regression回归Clustering聚类Dimensionality reduction降维算法Model selection模型选择Preprocessing数据预处理
一、首先导入相关的工具包以及x轴y轴字体大小设置
import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams[axes.labelsize] 14
plt.rcParams[xtick.labelsize] 12
plt.rcParams[ytick.labelsize] 12
import warnings
warnings.filterwarnings(ignore)
np.random.seed(42)二、数据集读取
使用的数据集是sklearn内置数据集MNIST手写数字识别数据集70000张灰度图像的数字大小为(28,28,1)28 * 28 * 1784每一个图像样本都有784个像素点可以的等价于784个特征。 免费MNIST手写数字识别数据集下载 将下载好的mnist-original放到C:\Users\MyPC\scikit_learn_data下创建一个mldata文件夹
#查看下路径
from sklearn.datasets.base import get_data_home
print (get_data_home())#C:\Users\MyPC\scikit_learn_datafrom sklearn.datasets import fetch_openml
mnist fetch_openml(mnist_784)#手写数字识别数据集量少好观察
print(mnist)#数据集中X是mnist里面存放类似字典的结构里面所有数据的key是datay是标签存放target
#Xmnist将data传入ymnist将target传入
X, y mnist[data], mnist[target]
X.shape#(70000, 784) 当前样本数量一共7w个78428*28*1
y.shape#(70000,) 第一行标签为0第二行标签为1以此类推共70000行#前6w张当作训练集training后1w张当作测试集testing
#1-6w 这6w个样本为训练集training、6w到最后7w 这1w个样本为testing测试集
X_train, X_test, y_train, y_test X[:60000], X[60000:], y[:60000], y[60000:]# 因为是数据之间是独立的故需要洗牌操作将training训练集和testing测试集打乱顺序
import numpy as npshuffle_index np.random.permutation(60000)#打算数据集的index
X_train, y_train X_train[shuffle_index], y_train[shuffle_index]#回传给数据集相当于洗牌打乱操作#原始index值为012...打乱顺序之后的index如下所示
shuffle_index#array([12628, 37730, 39991, ..., 860, 15795, 56422])三、交叉验证
由上几步可得将数据集的前6w为训练集training后1w为测试集testing 首先将整个数据集分为两部分训练集和测试集其中测试集相当于高考测试集是非常非常宝贵的东西仅此一次。故为了效果更好需要中途在进行几次模拟考试类似期中期末考试这时候需要从训练集中再抽取出一部分充当期中期末考试即验证集validation。
例如training中有5份样本交叉验证就是将这5份打乱依次从中随机抽取1份为validation剩下的为training。然后每次通过模型去训练得出一个预测结果求取平均值即可。
# 为了简单起见这里只判断样本是否是5
y_train_5 (y_train5)#是否是5
y_test_5 (y_test5)#将10分类转换为2分类进行演示#训练集前十个样本是不是5
y_train_5[:10]#array([False, False, False, False, False, False, False, False, False, True])SGDClassifier的方法详细参数
#SGDClassifier 梯度下降分类器
from sklearn.linear_model import SGDClassifier
sgd_clf SGDClassifier(max_iter5,random_state42)#max_iter最大迭代次数random_state随机种子每次随机策略都一样
sgd_clf.fit(X_train,y_train_5)#通过SGD训练分类器SGDClassifier(alpha0.0001, averageFalse, class_weightNone,early_stoppingFalse, epsilon0.1, eta00.0, fit_interceptTrue,l1_ratio0.15, learning_rateoptimal, losshinge, max_iter5,n_iterNone, n_iter_no_change5, n_jobsNone, penaltyl2,power_t0.5, random_state42, shuffleTrue, tolNone,validation_fraction0.1, verbose0, warm_startFalse)#训练完成之后对该分类器进行测试预测35000这个样本是5为啥然后进行通过索引查下是否是5
sgd_clf.predict([X[35000]])#array([ True])#通过索引验证下35000样本是否是5
y[35000]#5.0Ⅰ交叉验证的实现
cross_val_score方法的详细参数 参数一将训练的模型传入进来
参数二传入当前的训练数据
参数三当前的标签
参数四cv3表示把数据集切分成3分最后进行3次交叉验证会输出3个交叉验证的结果
参数五使用什么指标进行评估得分,accuracy表示使用准确率来进行评估from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf,X_train,y_train_5,cv3,scoringaccuracy)#array([0.9502 , 0.96565, 0.96495])X_train.shape#(60000, 784)#训练的时候传入了6w个样本y_train_5.shape#(60000,)Ⅱ自己对数据集进行切分训练预测 StratifiedKFold方法的详细参数 clone方法的详细参数 因为把数据集切分为多份每一份都需要用的和原来一样的分类器相同的模型相同的参数。 交叉验证为了保证公平每次传入的参数都是相同的。为了保证公平使用了clone方法。
from sklearn.model_selection import StratifiedKFold
from sklearn.base import cloneskflods StratifiedKFold(n_splits3,random_state42)#将数据集分成3分随机种子这里设置的为42
for train_index,test_index in skflods.split(X_train,y_train_5):#对每一份数据集进行fit操作split方法切分数据集和标签clone_clf clone(sgd_clf)#克隆分类器X_train_folds X_train[train_index]#通过索引找图片样本y_train_folds y_train_5[train_index]#这三类训练和测试数据都要来源于trainingX_test_folds X_train[test_index]y_test_folds y_train_5[test_index]clone_clf.fit(X_train_folds,y_train_folds)y_pred clone_clf.predict(X_test_folds)n_correct sum(y_pred y_test_folds)print(n_correct/len(y_pred))0.9502
0.96565
0.96495四、Confusion Matrix-混淆矩阵
已知条件一个班100人男80女20。 目标找出所有女生。 结果从班里面找了50人其中20个女的30个男的。
相关Relevant正类无关NonRelevant负类被检索到RetrievedTrue PositivesTP正类判定为正类即准确判断出这是为女生False PositivesFP负类判定为正类“存伪”即分明是男生却判断出是女生没被检索到NotRetrievedFalse NegativesFN正类判定为负类“去真”即分明是女生却判断出是男生True Negatives,TN负类判定为负类即一个男生被判定是男生
故TP20FP30FN0TN50 cross_val_predict方法的详细参数 参数一分类器的名称
参数二训练集
参数三标签
参数四分成几份from sklearn.model_selection import cross_val_predict
y_train_pred cross_val_predict(sgd_clf,X_train,y_train_5,cv3)y_train_pred.shape#(60000,)#训练的时候传入了6w个样本得到6w个样本的预测结果X_train.shape#(60000, 784)confusion_matrix方法的详细参数 一般的混淆矩阵参数为2×2
参数一训练值
参数二实际预测结果from sklearn.metrics import confusion_matrix
confusion_matrix(y_train_5,y_train_pred)array([[53272, 1307],[ 1077, 4344]], dtypeint64)对于array数组中参数分析
五、Precision精度 and Recall召回率 Positives5 Negatives ≠5 precision_score方法的详细参数 recall_score方法的详细参数
from sklearn.metrics import precision_score,recall_score
precision_score(y_train_5,y_train_pred)#0.7687135020350381recall_score(y_train_5,y_train_pred)#0.801328168234643将Precision 和 Recall结合到一个称为F1 score 的指标,调和平均值给予低值更多权重。 因此如果召回和精确度都很高分类器将获得高F 1分数。 f1_score方法的详细参数
from sklearn.metrics import f1_score
f1_score(y_train_5,y_train_pred)#0.7846820809248555六、阈值对结果的影响 decision_function方法的详细参数
y_scores sgd_clf.decision_function([X[35000]])
y_scores#array([43349.73739616])t 50000
y_pred (y_scores t)#设置阈值
y_pred#array([False])Scikit-Learn不允许直接设置阈值但它可以得到决策分数调用其decision_function方法而不是调用分类器的predict方法该方法返回每个实例的分数然后使用想要的阈值根据这些分数进行预测
y_scores cross_val_predict(sgd_clf, X_train, y_train_5, cv3, methoddecision_function)y_scores[:10]array([ -434076.49813641, -1825667.15281624, -767086.76186905,-482514.55006702, -466416.8082872 , -311904.74603814,-582112.5580173 , -180811.15850786, -442648.13282116,-87710.09830358])from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds precision_recall_curve(y_train_5, y_scores)y_train_5.shape#(60000,)#6w个样本thresholds.shape#(59698,)#59698个阈值precisions[:10]array([0.09080706, 0.09079183, 0.09079335, 0.09079487, 0.09079639,0.09079792, 0.09079944, 0.09080096, 0.09080248, 0.090804 ])precisions.shape#(59699,)#59699个阈值recalls.shape#(59699,)#59699个阈值对于不同的阈值随着阈值的变换精度和召回率变换的情况如下
def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):plt.plot(thresholds,precisions[:-1],b--,labelPrecision)plt.plot(thresholds,recalls[:-1],g-,labelRecall)plt.xlabel(Threshold,fontsize16)plt.legend(locupper left,fontsize16)plt.ylim([0,1])plt.figure(figsize(8, 4))
plot_precision_recall_vs_threshold(precisions,recalls,thresholds)
plt.xlim([-700000, 700000])
plt.show()随着Recall的变换Precision的变换如下
def plot_precision_vs_recall(precisions, recalls):plt.plot(recalls, precisions, b-, linewidth2)plt.xlabel(Recall, fontsize16)plt.ylabel(Precision, fontsize16)plt.axis([0, 1, 0, 1])plt.figure(figsize(8, 6))
plot_precision_vs_recall(precisions, recalls)
plt.show()七、ROC curves常用
receiver operating characteristic (ROC) 曲线是二元分类中的常用评估方法 ①它与精确度/召回曲线非常相似但ROC曲线不是绘制精确度与召回率而是绘制true positive rate(TPR) 与false positive rate(FPR) ②要绘制ROC曲线首先需要使用roc_curve函数计算各种阈值的TPR和FPR TPR TP / (TP FN) (Recall) FPR FP / (FP TN)
from sklearn.metrics import roc_curve
fpr, tpr, thresholds roc_curve(y_train_5, y_scores)def plot_roc_curve(fpr, tpr, labelNone):plt.plot(fpr, tpr, linewidth2, labellabel)plt.plot([0, 1], [0, 1], k--)plt.axis([0, 1, 0, 1])plt.xlabel(False Positive Rate, fontsize16)plt.ylabel(True Positive Rate, fontsize16)plt.figure(figsize(8, 6))
plot_roc_curve(fpr, tpr)
plt.show()虚线表示纯随机分类器的ROC曲线; 一个好的分类器尽可能远离该线朝左上角。
比较分类器的一种方法是测量曲线下面积AUC。完美分类器的ROC AUC等于1而纯随机分类器的ROC AUC等于0.5。 Scikit-Learn提供了计算ROC AUC的函数
from sklearn.metrics import roc_auc_scoreroc_auc_score(y_train_5, y_scores)#0.9624496555967156