- 一、任务
- 二、数据集
- 三、导入的包中方法、函数
- 四、代码及解释
本文从初学者的角度,帮助了解二分类机器学习算法的运用流程,以具体的例子介绍scikit learn包的使用。
一、任务识别图片中的数字是不是5(二分类问题)。
二、数据集7000张图片数据,每张图片包含1-10任一手写的数字。在基础的csv格式数据集中,每张图片用784个像素特征表示(当值为0时,代表该位置无手写笔迹),每张图片都已标记好所代表的数字。
三、导入的包中方法、函数sklearn包所包含的方法函数众多,为便于记忆,现按照使用顺序,罗列出import的函数。函数具体的使用方法都可以在网址 https://scikit-learn.org/stable/user_guide.html 中找到。
from sklearn.datasets import fetch_openml from sklearn.linear_model import SGDClassifier from sklearn.model_selection import cross_val_predict from sklearn.metrics import precision_score,recall_score from sklearn.metrics import f1_score from sklearn.ensemble import RandomForestClassifier
1、openml类似于Kaggle,包含众多公开的机器学习数据集和项目。sklearn已与该网站打通,通过fetch_openml函数下载数据。
2、sklearn.linear_model中除了 SGDClassifier外,还有LogisticRegression、LinearRegression等常用线性模型函数。
3、 cross_val_predict是model validation的环节,对每一个输入数据点生成交叉验证的估计。
4、metrics包含的度量模型预测效果的函数众多,详情参阅https://scikit-learn.org/stable/modules/classes.html?highlight=sklearn%20metrics#module-sklearn.metrics。
5、关于ensemble-based的算法,诸如随机森林法,后期完善。
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_openml
#导入数据
mnist=fetch_openml('mnist_784',version=1)
#拿到的数据是字典格式,字典data/target键值以np array的数组存储
X,y=mnist['data'],mnist['target']
# y数据格式为object需要转换成整数型
y=y.astype(np.uint8)
#划分训练集和测试集
X_train,X_test,y_train,y_test=X[:6000],X[6000:],y[:6000],y[6000:]
#数字五时为TURE,否则为False
y_train_5=(y_train==5)
y_test_5=(y_train==5)
# 模型训练
sgd_clf=SGDClassifier(random_state=42)
#cv=3表示将数据分为3folds,分别在2折上训练模型,在余下的1折上验证模型,并将余下1折中样本的预测输出作为最终输出结果的一部分。
sgd_y_train_pred=cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)
#比较原数据与预测数据值
sgd_ps=precision_score(y_train_5,sgd_y_train_pred)
sgd_rs = recall_score(y_train_5,sgd_y_train_pred)
sgd_f1 = f1_score(y_train_5,sgd_y_train_pred)
#默认method是None,当用了decision_function将传回所有数据判定概率/分数,用于后续算出ROC值,None时相当于算法自动给出判定,大于0.5则是TURE,小于0.5则是False.
y_scores_sgd = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
auc_sgd=roc_auc_score(y_train_5,y_scores_sgd)
#随机森林
rfc=RandomForestClassifier(n_estimators=100,random_state=42)
y_predicted_forest=cross_val_predict(rfc, X_train, y_train_5)
p_forest=precision_score(y_train_5,y_predicted_forest)
re_forest=recall_score(y_train_5,y_predicted_forest)
f1_forest=f1_score(y_train_5,y_predicted_forest)
#每一个分类器都有属于自己的method,以下求率定估计值是固定的格式搭配
y_probas_forest=cross_val_predict(rfc, X_train, y_train_5,cv=3,method='predict_proba')
#与SGDClassifer不同,随机森林发返回的分数值有两列,第一列为预测值0的概率,第二列为预测值为1的概率,所以需要取第二列。
y_scores_forest=y_probas_forest[:,1]
auc_forest=roc_auc_score(y_train_5,y_scores_forest)



