[scikit-learn 机器学习] 3. K-近邻算法分类和回归

文章目录

    • 1. KNN模型
    • 2. KNN分类
    • 3. 使用sklearn KNN分类
    • 4. KNN回归

本文为 scikit-learn机器学习(第2版)学习笔记

K 近邻法(K-Nearest Neighbor, K-NN) 常用于 搜索和推荐系统。

1. KNN模型

  • 确定距离度量方法(如欧氏距离)
  • 根据 K 个最近的距离的邻居样本,选择策略做出预测
  • 模型假设:距离相近的样本,有接近的响应值

2. KNN分类

根据身高、体重对性别进行分类

import numpy as np
import matplotlib.pyplot as pltX_train = np.array([[158, 64],[170, 86],[183, 84],[191, 80],[155, 49],[163, 59],[180, 67],[158, 54],[170, 67]
])
y_train = ['male', 'male', 'male', 'male', 'female', 'female', 'female', 'female', 'female']plt.figure()
plt.title('Human Heights and Weights by Sex')
plt.xlabel('Height in cm')
plt.ylabel('Weight in kg')for i, x in enumerate(X_train):if y_train[i] == 'male':c1 = plt.scatter(x[0], x[1], c='k', marker='x')else:c2 = plt.scatter(x[0], x[1], c='r', marker='o')
plt.grid(True)
plt.legend((c1,c2),('male','female'),loc='lower right')
# plt.show()

在这里插入图片描述

  • 对身高 155cm,体重 70 kg的人进行性别预测
  • 设置 KNN 模型 k = 3
计算距离
x = np.array([[155,70]])
dis = np.sqrt(np.sum((X_train-x)**2 ,axis = 1))
dis
选取最近k个
nearset_k_neighbor = dis.argsort()[0:3]
k_genders = [y_train[i] for i in nearset_k_neighbor]
k_genders  # ['male', 'female', 'female']
计算最近的k个的标签
from collections import Counter
# b = Counter(np.take(y_train, dis.argsort()[0:3]))
b = Counter(k_genders)
b # Counter({'male': 1, 'female': 2})
性别为女性占多数
# help(Counter.most_common)
# most_common(self, n=None)
#     List the n most common elements and their counts from the most
#     common to the least.  If n is None, then list all element counts.
b.most_common(2) # [('female', 2), ('male', 1)]
b.most_common(1)[0][0] # 'female'

3. 使用sklearn KNN分类

标签(male,female)数字化(0,1)

from sklearn.preprocessing import LabelBinarizer
from sklearn.neighbors import KNeighborsClassifierlb = LabelBinarizer()
y_train_lb = lb.fit_transform(y_train)
y_train_lb
######
array([[1],[1],[1],[1],[0],[0],[0],[0],[0]])

预测前面的例子的性别

K=3
clf = KNeighborsClassifier(n_neighbors=K)
clf.fit(X_train,y_train_lb.ravel())
pred_gender = clf.predict(x)
pred_gender # array([0])
pred_label_gender = lb.inverse_transform(pred_gender)
pred_label_gender # array(['female'], dtype='<U6')

在test集上验证

X_test = np.array([[168, 65],[180, 96],[160, 52],[169, 67]
])
y_test = ['male', 'male', 'female', 'female']
y_test_lb = lb.transform(y_test)pred_lb = clf.predict(X_test)
print('Predicted labels: %s' % lb.inverse_transform(pred_lb))
# Predicted labels: ['female' 'male' 'female' 'female']

计算评价指标

准确率:预测对了的比例3/4
from sklearn.metrics import accuracy_score
accuracy_score(y_test_lb, pred_lb) # 0.75
精准率:正类为男,男预测为男/(男预测男+女预测男)
from sklearn.metrics import precision_score
precision_score(y_test_lb, pred_lb) # 1.0
召回率: 男预测男/(男预测男+男预测女)
from sklearn.metrics import recall_score
recall_score(y_test_lb, pred_lb) # 0.5

F1 值

F1 得分是:精准率和召回率的均衡
from sklearn.metrics import f1_score
f1_score(y_test_lb, pred_lb) # 0.6667
评价报告
from sklearn.metrics import classification_report
# help(classification_report)
# classification_report(y_true, y_pred, labels=None, target_names=None, s
#        ample_weight=None, digits=2, output_dict=False, zero_division='warn')
print(classification_report(y_test_lb, pred_lb, target_names=['male','female'], labels=[1,0]))

在这里插入图片描述

4. KNN回归

根据身高、性别,预测其体重

from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error,r2_scoreX_train = np.array([[158,  1],[170,  1],[183,  1],[191,  1],[155,  0],[163,  0],[180,  0],[158,  0],[170,  0]
])
y_train = [64,86,84,80,49,59,67,54,67]X_test = np.array([[168,  1],[180,  1],[160,  0],[169,  0]
])
y_test = [65,96,52,67]K = 3
clf = KNeighborsRegressor(n_neighbors=K)
clf.fit(X_train, y_train)
predictions = clf.predict(np.array(X_test))
predictions # array([70.66666667, 79.        , 59.        , 70.66666667])# help(r2_score)
# R^2 (coefficient of determination)
r2_score(y_test, predictions) # 0.6290565226735438平均绝对值误差
mean_absolute_error(y_test, predictions) # 8.333333333333336平均平方误差
mean_squared_error(y_test, predictions)  # 95.8888888888889
  • 数据没有标准化的影响
from scipy.spatial.distance import euclidean
# help(euclidean) # 欧氏距离
X_train = np.array([[1700,1],[1600,0]
])
X_test = np.array([1640,1]).reshape(1,-1)
print(euclidean(X_train[0,:], X_test))
print(euclidean(X_train[1,:], X_test))
# 60.0
# 40.01249804748511X_train = np.array([[1.7,1],[1.6,0]
])
X_test = np.array([1.64,1]).reshape(1,-1)
print(euclidean(X_train[0,:], X_test))
print(euclidean(X_train[1,:], X_test))
# 0.06000000000000005
# 1.0007996802557444

可以看出不同单位下的欧式距离差异很大

  • 进行数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)print(X_train)
print(X_train_scaled)
[[158   1][170   1][183   1][191   1][155   0][163   0][180   0][158   0][170   0]]
[[-0.9908706   1.11803399][ 0.01869567  1.11803399][ 1.11239246  1.11803399][ 1.78543664  1.11803399][-1.24326216 -0.89442719][-0.57021798 -0.89442719][ 0.86000089 -0.89442719][-0.9908706  -0.89442719][ 0.01869567 -0.89442719]]
  • 标准化特征后 模型误差更低
pred = clf.predict(X_test_scaled)
pred # array([78.        , 83.33333333, 54.        , 64.33333333])# R^2 (coefficient of determination)
r2_score(y_test, pred) # 0.6706425961745109# 平均绝对值误差
mean_absolute_error(y_test, pred) # 7.583333333333336# 平均平方误差
mean_squared_error(y_test, pred)  # 85.13888888888893

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matplotlib - 柱状图、直方图、条形图 bar() barh() 所有用法详解

目录 基本用法 多个直方图并列显示 显示直方图上的数值 多个直方图堆叠显示 水平直方图 相较散点图和折线图&#xff0c;柱状图&#xff08;直方图、条形图&#xff09;、饼图、箱线图是另外 3 种数据分析常用的图形&#xff0c;主要用于分析数据内部的分布状态或分散状…

word里双横线怎么打_美人计 | 精致打工人秀智,教你内双怎么化

通勤妆千千万&#xff0c;大家画好才能算。国民初恋裴秀智搭档“南朋友”南柱赫&#xff0c;《启动了》这部剧让很多颜值控都纷纷沦陷了。起初奔着这两大主角看的&#xff0c;结果看着看着又被男二金宣虎圈了粉&#xff0c;在剧中裴秀智和金宣虎两小无猜的感情没能发展成爱情&a…

Matplotlib - 饼图、环形图 pie() 多重饼图 subplots() 所有用法详解

目录 基本用法 饼图中突出显示某部分 环形图&#xff08;空心饼图&#xff09; 多重饼图&#xff0c;并添加分割线 相较散点图和折线图&#xff0c;柱状图、饼图、箱线图是另外 3 种数据分析常用的图形&#xff0c;主要用于分析数据内部的分布状态或分散状态。饼图主要用于…

USACO2.11 The Castle hdu1198

题意&#xff1a; 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物&#xff1a;一张“幸运爱尔兰”&#xff08;一种彩票&#xff09;。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡&#…

Matplotlib - 箱线图、箱型图 boxplot () 所有用法详解

目录 基本用法 水平箱线图&#xff0c;显示均值 改变箱线图的形状&#xff08;箱体的形状notch、异常值的形状sym&#xff09; 改变箱线图的颜色&#xff08;箱体边框的颜色、箱体填充色&#xff09; 相较散点图和折线图&#xff0c;柱状图、饼图、箱线图&#xff08;箱…

【转载】三极管,场效应管 工作原理小结

三极管属于流控器件&#xff0c;即Ib控制放大Ic&#xff0c; 场效应管属于压控器件&#xff0c;即Ugs控制Id。 二者都有三个工作区域&#xff0c;即截止区&#xff0c;恒流区和可变电阻区。 Ib小于开启电流时&#xff0c;Ic不受控&#xff0c;Rce很大&#xff0c;Ic很小&#x…

educoderpython答案顺序结构程序设计_答案汇总:土木机械类+计算机类

土木机械类(点击图片查看答案)理论力学1哈工大第7版机械设计濮良贵第9版机械原理西工大第8版材料力学1刘鸿文第5版结构力学1龙驭球第4版结构力学朱慈勉第2版工程力学范钦珊第2版材料力学2孙训方第5版理论力学教程水小平机械工程控制基础杨叔子第6版自动控制原理胡寿松第6版土力…

Pyecharts - 动态地图 geo()/ map() - 安装与用法详解

目录 安装Pyecharts 安装对应的地图拓展&#xff1a; 准备数据 使用 pyecharts 模块中的 Geo 函数&#xff1a; 使用 pyecharts 模块中的 map 函数&#xff1a; 把一些地域性比较明显的数据显示在一张地图上&#xff0c;远比给别人一个 Excel 文件好得多。 Matplotlib 中…

[编程启蒙游戏] 1. 猜数字

文章目录1. 游戏前提2. 游戏目的3. python代码4. 玩一玩1. 游戏前提 儿童能认识数字能比较数字大小 2. 游戏目的 培养孩子的二分查找思维 3. python代码 # python 3.7 环境 while True:n int(input("请输入一个数来猜&#xff1a;\n"))count 1print((\n*15))g…

生命银行怎么样_银行双职工家庭现状实录

和大多数银行女一样&#xff0c;我和老公也是同在银行上班相识&#xff0c;14年结婚&#xff0c;15年9月&#xff0c;大儿子出生&#xff0c;然后婆婆跟妈妈轮流照顾小孩&#xff0c;18年1月&#xff0c;小儿子出生&#xff0c;从此便开始了歇斯里底&#xff0c;腥风血雨的生活…

特征计算 - Jaccard 相似系数与 Python 代码实现

Jaccard 相似系数又称为Jaccard相似性度量&#xff08;Jaccard系数&#xff0c;Jaccard 指数&#xff0c;Jaccard index&#xff09;。用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大&#xff0c;样本相似度越高。定义为相交的大小除以样本集合的大小&#xff1a;…

天气预报Dom解析(转)

view plain<span style"font-family:Arial, Verdana, sans-serif;color:#000000;"><span style"white-space: normal;"><span style"color:#000099;"> </span></span></span> DOM是用与平台无关和语言无关…

[scikit-learn 机器学习] 4. 特征提取

文章目录1. 从类别变量中提取特征2. 特征标准化3. 从文本中提取特征3.1 词袋模型3.2 停用词过滤3.3 词干提取和词形还原3.4 TF-IDF 权重扩展词包3.5 空间有效特征向量化与哈希技巧3.6 词向量4. 从图像中提取特征4.1 从像素强度中提取特征4.2 使用卷积神经网络激活项作为特征本文…

LeetCode 第 29 场双周赛(890/2259,前39.4%)

文章目录1. 比赛结果2. 题目1. LeetCode 5432. 去掉最低工资和最高工资后的工资平均值 easy2. LeetCode 5433. n 的第 k 个因子 medium3. LeetCode 5434. 删掉一个元素以后全为 1 的最长子数组 medium4. LeetCode 5435. 并行课程 II hard1. 比赛结果 做出来了3道题。第三题卡了…

【dll 返回字符串 】2

【vc <--> vc】返回void* 类型void* __stdcall torrent_hash( const char *TorrentFilePath){char szText[41]{0};if(strcmp(TorrentFilePath,"") 0 || TorrentFilePath NULL)return NULL;string strHashString "abcdefg"; sprintf(szText,&qu…

LeetCode 1496. 判断路径是否相交(set)

1. 题目 给你一个字符串 path&#xff0c;其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’&#xff0c;分别表示向北、向南、向东、向西移动一个单位。 机器人从二维平面上的原点 (0, 0) 处开始出发&#xff0c;按 path 所指示的路径行走。 如果路径在任何位置上出…

电压压力蕊片_一文让你知道什么是压力变送器

一般来说&#xff0c;压力变送器主要由测压元件传感器(也称作压力传感器)、测量电路和过程连接件三部分组成。它能将测压元件传感器感受到的气体、液体等物理压力参数转变成标准的电信号(如4~20mADC等)&#xff0c;以供给指示报警仪、记录仪、调节器等二次仪表进行测量、指示和…

C# 多线程编程 ThreadStart ParameterizedThreadStart

原文地址&#xff1a;http://club.topsage.com/thread-657023-1-1.html 在实例化Thread的实例&#xff0c;需要提供一个委托&#xff0c;在实例化这个委托时所用到的参数是线程将来启动时要运行的方法。在.net中提供了两种启动线程的方式&#xff0c;一种是不带参数的启动…

Matlab编程学习笔记【待续】

最近想用Matlab进行数据分析&#xff0c;算法性能测试&#xff0c;平时由于用的是C、C&#xff0c;因此很多习惯都一时改不了&#xff0c;这里自己列出来一些Matlab中明显不同的地方。 矩阵单元元素访问方式&#xff1a;A(1,2)---A[1][2]选取矩阵某个行或者列&#xff1a;A(:,1…

animation 先执行一次 在持续执行_这一次,彻底弄懂 JavaScript 执行机制

本文来源&#xff1a;ssssyokihttps://juejin.im/post/6844903512845860872不论你是javascript新手还是老鸟&#xff0c;不论是面试求职&#xff0c;还是日常开发工作&#xff0c;我们经常会遇到这样的情况&#xff1a;给定的几行代码&#xff0c;我们需要知道其输出内容和顺序…