从零开始学习机器学习

2,954 阅读3分钟

参考文章:juejin.cn/post/684490…

什么是机器学习

机器学习是根据大量现有的数据,找出一个基本拟合的函数(模型),并根据该函数对新数据进行预测、决策、分类等技术。

比如,现有数据:

身高体重
160120
170130
180140

假设身高=x,体重=y,最拟合的函数是 y = 1 * x + 40

那么根据函数,我们预测身高=190的人,体重=150

以上例子是理想的情况,实际我们接触的数据远比它大,维度(列)也多,不能轻易地给出一个完全拟合的函数,但是我们仍然有办法找到该函数,这个过程就是机器学习的过程。

开始练习

安装环境

  • pip3 install virtualenv
  • virtualenv ai_python
  • source ./ai_python/bin/activate

安装依赖库

  • pip install numpy # 数值处理库
  • pip install pillow # 简单的图像处理库
  • pip install --upgrade scikit-learn # 包含多种机器学习算法的工具包
  • pip install tensorflow # 深度学习库
  • pip install keras # 深度学习库
  • pip install opencv-contrib-python # 图像识别工具
  • pip install --upgrade imutils # 图像处理库

引入算法库

  • KNN
  • 朴素贝叶斯
  • 逻辑回归
  • SVM
  • 决策树
  • 随机森林
  • 感知机

准备数据

鸢尾花数据集(部分),共计150条记录,包含 setosa,versicolor,virginica 三种花型

叶片长度叶片宽度花瓣长度花瓣宽度鸢尾花类型
5.13.51.40.2setosa
6.93.14.91.5versicolor
7.72.86.72.0virginica
6.13.04.91.8virginica
6.22.24.51.5versicolor

测试

# coding: utf-8

from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse

# 根据参数选择模型
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="请输入模型简称")
args = vars(ap.parse_args())

models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}

# 载入鸢尾花数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
# random_state是随机状态,类似随机种子
print("载入鸢尾花数据集...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)

# 训练模型
print("正在使用模型:'{}'".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出一份分类结果报告
print("生成结果报告")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

结果报告

image.png

报告解析

举个例子,现有100人,专家预测大概30人为阳性,70人为阴性,现在有一个模型,在专家预测阳性的30人中,20人阳性,10人为阴性,在专家预测阴性的70人中,5人阳性,65人阴性。

  • 预测正确 = 阳性样本预测结果为阳,阴性样本预测结果为阴 = T
  • 预测错误 = 阳性样本预测结果为阴,阴性样本预测结果为阳 = F
  • 正样本数量 = 专家预测阳性的30人 = P
  • 负样本数量 = 专家预测阴性的70人 = N
  • 正样本中预测结果为正的数量 = 专家预测阳性样本中预测结果为阳的数量 = TP
  • 正样本中预测结果为负的数量 = 专家预测阳性样本中预测结果为阴的数量 = FP
  • 负样本中预测结果为正的数量 = 专家预测阴性样本中预测结果为阳的数量 = FN
  • 负样本中预测结果为负的数量 = 专家预测阴性样本中预测结果为阴的数量 = TN
  • 准确率 = accuracy = (TP + TN) / (TP + FP + TN + FN)
  • 精准率 = precision = TP / (TP + FP)
  • 召回率 = recall = TP / (TP + FN)
  • F1 = f1-score (2 * 精准率 * 召回率)/ (精准率 + 召回率)
  • support = 预测时的样本容量
  • macro avg = 宏平均 = 每个分类的精准率之和 / 分类数
  • weighted avg = 加权平均 = ∑(分类的精准率*分类的support/总support)

一般看weighted avg 即可知道该模型预测的准确率