AI派在读学生小姐姐Beyonce

Java实战项目练习群

长按识别下方二维码,按需求添加

扫码添加Beyonce小姐姐

扫码关注

进Java学习大礼包

机器学习KNN算法实践

预测城市空气质量

「Python数据之道」导读: 之前在公众号上分享过 “图解KNN算法” 的内容(点击下面链接前往),今天来分享下使用KNN算法进行案例实践,进一步加深对KNN算法的理解。

  • 图解超经典的KNN算法

一、KNN算法简介

KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中常用算法之一,其指导思想是"近朱者赤,近墨者黑",即由你的邻居来推断出你的类别。

KNN 最邻近分类算法的实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近K个已知样本,再根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多归为一类

KNN算法的核心思想:寻找最近的k个数据,推测新数据的分类

KNN算法的关键:

  • 样本的所有特征都要做可比较的量化 若是样本特征中存在非数值的类型,必须采取手段将其量化为数值。例如样本特征中包含颜色,可通过将颜色转换为灰度值来实现距离计算。

  • 样本特征要做归一化处理 样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对距离计算的影响不一样,如取值较大的影响力会盖过取值较小的参数。所以样本参数必须做一些 scale 处理,最简单的方式就是所有特征的数值都采取归一化处置。

  • 需要一个距离函数以计算两个样本之间的距离 通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

以计算二维空间中的 A(x1,y1)B(x2,y2) 两点之间的距离为例,常用的欧氏距离的计算方法如下图所示:

  • 确定 K 的值 K 值选的太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。

  • KNN 算法的优点:简单,易于理解,易于实现,无需估计参数,无需训练;适合对稀有事件进行分类;特别适合于多分类问题(multi-modal,对象具有多个类别标签), KNNSVM 的表现要好。

  • KNN算法的缺点:KNN算法在分类时有个主要的不足是:当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。

  • 该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的 K 个最近邻点。可理解性差,无法给出像决策树那样的规则。

二、KNN算法实现思路

要自己动手用 Python 实现 KNN 算法,主要有以下三个步骤:

  • 算距离:给定待分类样本,计算它与已分类样本中的每个样本的距离;

  • 找邻居:圈定与待分类样本距离最近的 K 个已分类样本,作为待分类样本的近邻;

  • 做分类:根据这 K 个近邻中的大部分样本所属的类别来决定待分类样本该属于哪个分类;

三、KNN算法预测城市空气质量

1. 获取数据

数据来源:http://www.tianqihoubao.com/aqi/chengdu-201901.html

对于这种 Table 表格型数据,可以直接用 pandas 的 read_html() 大法,将数据保存到csv,也就不用再写爬虫去解析网页和提取数据了。

# -*- coding: UTF-8 -*-
import pandas as pd
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')for page in range(1, 13):   # 12个月if page < 10:url = f'http://www.tianqihoubao.com/aqi/guangzhou-20190{page}.html'df = pd.read_html(url, encoding='gbk')[0]if page == 1:df.to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)else:df.iloc[1:,::].to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)else:url = f'http://www.tianqihoubao.com/aqi/guangzhou-2019{page}.html'df = pd.read_html(url, encoding='gbk')[0]df.iloc[1:,::].to_csv('2019年广州空气质量数据.csv', mode='a+', index=False, header=False)logging.info(f'{page}月空气质量数据下载完成!')

多爬取几个城市 2019 年历史空气质量数据保存到本地

2. 生成测试集和训练集

首先,我们要对数据进行简单的处理,这里选择两个城市:成都和天津。

成都

import pandas as pd# 将2019年成都空气质量数据作为测试集
df = pd.read_csv('2019年成都空气质量数据.csv')
# 取质量等级  AQI指数  当天AQI排名  PM2.5 。。。8列数据
# SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 解决方法
df1 = df[['AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']].copy()air_quality = []
# print(df['质量等级'].value_counts())
# 质量等级列数据为字符串  转为为标签  便于判断预测
for i in df['质量等级']:if i == "优":air_quality.append('1')elif i == "良":air_quality.append('2')elif i == "轻度污染":air_quality.append('3')elif i == "中度污染":air_quality.append('4')elif i == "重度污染":air_quality.append('5')elif i == "严重污染":air_quality.append('6')print(air_quality)
df1['空气质量'] = air_quality# 将数据写入test.txt
# print(df1.values, type(df1.values)) # <class 'numpy.ndarray'>
with open('test.txt', 'w') as f:for x in df1.values:print(x)s = ','.join([str(i) for i in x])# print(s, type(s))f.write(s + '\n')

天津

import pandas as pd# 自定义其他几个城市空气质量数据作为训练集
df = pd.read_csv('2019年天津空气质量数据.csv', encoding='utf-8')
# 取质量等级  AQI指数  当天AQI排名  PM2.5 。。。8列数据
# SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 解决方法
df1 = df[['AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']].copy()air_quality = []
# print(df['质量等级'].value_counts())
# 质量等级列数据为字符串  转为为数字标识
for i in df['质量等级']:if i == "优":air_quality.append('1')elif i == "良":air_quality.append('2')elif i == "轻度污染":air_quality.append('3')elif i == "中度污染":air_quality.append('4')elif i == "重度污染":air_quality.append('5')elif i == "严重污染":air_quality.append('6')print(air_quality)
df1['空气质量'] = air_quality# 将数据写入追加写入到train.txt
# print(df1.values, type(df1.values)) # <class 'numpy.ndarray'>
with open('train.txt', 'a+') as f:for x in df1.values:print(x)s = ','.join([str(i) for i in x])# print(s, type(s))f.write(s + '\n')

3. 实现KNN算法

读取数据集

def read_dataset(filename1, filename2, trainingSet, testSet):with open(filename1, 'r') as csvfile:lines = csv.reader(csvfile)  # 读取所有的行dataset1 = list(lines)       # 转化成列表for x in range(len(dataset1)):  # 每一行数据for y in range(8):dataset1[x][y] = float(dataset1[x][y])   # 8个参数转换为浮点数testSet.append(dataset1[x])    # 生成测试集with open(filename2, 'r') as csvfile:lines = csv.reader(csvfile)  # 读取所有的行dataset2 = list(lines)       # 转化成列表for x in range(len(dataset2)):   # 每一行数据for y in range(8):dataset2[x][y] = float(dataset2[x][y])  # 8个参数转换为浮点数trainingSet.append(dataset2[x])  # 生成训练集

计算欧氏距离

def calculateDistance(testdata, traindata, length):  # 计算距离distance = 0  # length表示维度 数据共有几维for x in range(length):distance += pow((int(testdata[x]) - int(traindata[x])), 2)return round(math.sqrt(distance), 3)    # 保留3位小数

找K个相邻最近的邻居

def getNeighbors(self, trainingSet, test_instance, k):  # 返回最近的k个边距distances = []length = len(test_instance)# 对训练集的每一个数计算其到测试集的实际距离for x in range(len(trainingSet)):dist = self.calculateDistance(test_instance, trainingSet[x], length)print('训练集:{} --- 距离:{}'.format(trainingSet[x], dist))distances.append((trainingSet[x], dist))distances.sort(key=operator.itemgetter(1))  # 按距离从小到大排列# print(distances)neighbors = []# 排序完成后取距离最小的前k个for x in range(k):neighbors.append(distances[x][0])print(neighbors)return neighbors

计算比例最大的分类

def getResponse(neighbors):   # 根据少数服从多数,决定归类到哪一类class_votes = {}for x in range(len(neighbors)):response = neighbors[x][-1]  # 统计每一个分类的多少  空气质量的数字标识if response in class_votes:class_votes[response] += 1else:class_votes[response] = 1print(class_votes.items())sortedVotes = sorted(class_votes.items(), key=operator.itemgetter(1), reverse=True)  # 按分类大小排序  降序return sortedVotes[0][0]    # 分类最大的  少数服从多数   为预测结果

预测准确率计算

def getAccuracy(test_set, predictions):correct = 0for x in range(len(test_set)):# predictions预测的与testset实际的比对  计算预测的准确率if test_set[x][-1] == predictions[x]:correct += 1else:# 查看错误预测print(test_set[x], predictions[x])print('有{}个预测正确,共有{}个测试数据'.format(correct, len(test_set)))return (correct / (len(test_set))) * 100.0

run函数调用

def run(self):training_set = []    # 训练集test_set = []        # 测试集self.read_dataset('./train_4/test.txt', './train_4/train.txt', training_set, test_set)  # 数据划分print('Train set: ' + str(len(training_set)))print('Test set: ' + str(len(test_set)))# generate predictionspredictions = []k = 7  # 取最近的6个数据for x in range(len(test_set)):  # 对所有的测试集进行测试neighbors = self.getNeighbors(training_set, test_set[x], k)  # 找到8个最近的邻居result = self.getResponse(neighbors)  # 找这7个邻居归类到哪一类predictions.append(result)accuracy = self.getAccuracy(test_set, predictions)print('预测准确度为:  {:.2f}%'.format(accuracy))   # 保留2位小数

运行效果如下:

可以通过增加训练集城市空气质量数据量,调节找邻居的数量k,提高预测准确率。

文末福利

各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。

这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的Beyonce小姐姐

一定要备注【高清图】

????????????????????

➕我们的Beyonce小姐姐微信要记得备注【高清图】

来都来了,喜欢的话就请分享点赞在看三连再走吧~~~

机器学习算法手把手实战:KNN预测城市空气质量相关推荐

  1. 机器学习KNN算法实践:预测城市空气质量

    出品:Python数据之道 作者:叶庭云 整理:Lemon 机器学习KNN算法实践 预测城市空气质量 「Python数据之道」导读: 之前在公众号上分享过 "图解KNN算法" 的内 ...

  2. 机器学习 手写KNN算法预测城市空气质量

    文章目录 一.KNN算法简介 二.KNN算法实现思路 三.KNN算法预测城市空气质量 1. 获取数据 2. 生成测试集和训练集 3. 实现KNN算法 一.KNN算法简介 KNN(K-Nearest N ...

  3. python空气质量分析与预测_干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?...

    原标题:干货!如何用 Python+KNN 算法实现城市空气质量分析与预测? 作者 | 李秋键 责编 | 伍杏玲 封图 | CSDN 付费下载自东方 IC 出品 | CSDN(ID:CSDNnews) ...

  4. 《机器学习算法竞赛实战》-chapter4特征工程

    <机器学习算法竞赛实战>学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅. 特征工程 特征工程是算法竞赛中工作量最大,决定参赛者能否拿到较好名次的关键部分.吴恩达老师说 ...

  5. 【新书推荐】机器学习算法竞赛实战,Kaggle Grandmaster倾力打造,涵盖Kaggle、天池等赛题...

    关注公众号,发现CV技术之美 随着互联网时代的到来,以及计算机硬件性能的提升,人工智能在近几年可以说是得到了爆发式的增长.互联网时代带来了大量的信息,这些信息是名副其实的大数据.另外,性能极佳的硬件也 ...

  6. 《机器学习算法竞赛实战》整理 | 八、实战案例:Elo Merchant Category Recommendation

    详情请参见原书 ​​​​​<机器学习算法竞赛实战(图灵出品)>(王贺,刘鹏,钱乾)[摘要 书评 试读]- 京东图书 前言 比赛链接: https://www.kaggle.com/comp ...

  7. 【粉丝福利】赠《机器学习算法竞赛实战》10 本书

    随着互联网时代的到来,以及计算机硬件性能的提升,人工智能在近几年可以说是得到了爆发式的增长.互联网时代带来了大量的信息,这些信息是名副其实的大数据.另外,性能极佳的硬件也使得计算机的计算能力大大增强, ...

  8. 白话机器学习算法理论+实战之PCA降维

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

  9. 白话机器学习算法理论+实战之K近邻算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑 ...

最新文章

  1. Prometheus 对比 Zabbix
  2. 控制编译文件控制代码质量
  3. RNA-seq需要多长的读长?
  4. Spring Boot并不重复“造轮子”
  5. 格伦布编码——rice编码无非是golomb编码M为2^x的特例
  6. Zabbix-Proxy-agent实现web监控
  7. 使用特殊的技术更新数据库(ABAP)
  8. Electron中通过process进程对象的api获取CPU、系统位数、环境变量等相关信息
  9. java碰到边界变颜色_求教!!!小球撞墙怎么改变颜色。
  10. html如何设置滑轮效果,HTML中鼠标滚轮事件onmousewheel处理
  11. selenium打开Firefox、IE、Chrome浏览器【python】
  12. 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比...
  13. java的堆排序_java中什么是堆排序?堆排序介绍
  14. 内存碎片过高优化的功能和原理
  15. 基于SSM的酒水商城系统
  16. r语言上机文本分析与词云绘制_R语言jiebaR包文本中文分词及词云上机练习,小白能做到...
  17. 需要将录音转文字在线转换,应该如何完成
  18. win10开机桌面图像获取
  19. HBase Flush 解析
  20. IPFS 之包管理器GX

热门文章

  1. line-height 垂直居中
  2. R语言作图不显示中文解决办法,如何使用中文字体
  3. oracle查所有字段,oracle查询所有表和字段
  4. java 设置pdf页面大小_通过Java实现对PDF页面的详细设置
  5. 深圳电话预订火车票体验
  6. DS18B20温度传感器闪烁中断问题测试
  7. 1-8-5 - 定期存款利息计算器
  8. 《汽车配件公司业务管理信息系统》系统设计报告
  9. 证券法律法规体系所有法律_告诉我法律
  10. LED灯泡巴西INMETRO认证需要准备哪些资料?