从零开始学习机器学习

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

什么是机器学习

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

比如,现有数据:

身高 体重
160 120
170 130
180 140

假设身高=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.1 3.5 1.4 0.2 setosa
6.9 3.1 4.9 1.5 versicolor
7.7 2.8 6.7 2.0 virginica
6.1 3.0 4.9 1.8 virginica
6.2 2.2 4.5 1.5 versicolor

测试

# 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 即可知道该模型预测的准确率

猜你喜欢

转载自juejin.im/post/7179604538490355769