从零开始学习机器学习

稀土掘金 稀土掘金

从零开始学习机器学习

2022年12月21日 22:14 ·  阅读 1648
关注

参考文章: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 即可知道该模型预测的准确率

分类:
人工智能
标签:
安装掘金浏览器插件
多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!
前往安装
收藏成功!
已添加到「」, 点击更改
  • 微信
    微信扫码分享
  • 新浪微博
  • QQ
沉浸阅读
温馨提示
当前操作失败,如有疑问,可点击申诉
前往申诉 我知道了

相关推荐

  • 为Kubernetes集群部署一个ChatGPT机器人
  • 当代年轻人养生现状 | 每日一冷
  • 靠大尺度,爆火全网!AI涉黄,竟是暴富密码?
  • 痛失又一个重大产业,日本人哭了
  • 俄乌冲突1周年,还要打多久?
  • 德国政界人士呼吁认真调查“北溪”被炸真相;拜登称打算竞选:被人质疑年龄完全合理;台枪击案两嫌犯自厦门被押解回台 | 每日大新闻
  • 不要运费、不要代购费,149抢美国C*stco网红爆款月亮椅!
  • 让《三体》从科幻片变成纪录片,怎么做?
  • 晚年为何不来华避难?穆沙拉夫:不想给中国添麻烦,我是争议人物
  • 中国开源社区健康案例——OpenHarmony社区
  • 新版本Linux QQ原生支持LoongArch架构
  • ChatGPT 版必应惨遭「切脑」,粉丝大闹 4 天!
  • 七十年编程语言发展漫谈
  • 稳住,ChatGPT不会失守!
  • SpringBoot 统一功能处理
  • 再见Swagger!推荐一款无侵入生成接口文档
  • 服务器性能监控,就靠它了!
  • Java 集合 Stream 流操作的基本使用教程
  • 精确控制 AI 图像生成的破冰方案,ControlNet 和 T2I-Adapter
  • 学透Spring,一次就够了