机器学习【系列】之第五章K近邻算法
第五章K近邻算法
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、pandas是什么?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
当有多种类别数据时,我们常常面临着对新加入的数据进行分类问题,例如:根据口味和色泽划分新的葡萄酒的类别,根据内容形式划分新上映电影的类别,根据过往人脸特征进行人脸识别等。这些问题都可以采纳机器学习中非常经典的K近邻算法来解决。本章将讲解K近邻算法的原理与代码实现,然后通过手写数字识别模型的案例来巩固所学知识。
一、K近邻算法的原理和代码实现
K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说:“离它最近”的K个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。
KNN最核心的功能“分类”是通过多数表决来完成的,具体方法就是在待分类的K个最近邻中查看哪个类别占比最多。哪个类别多,待分类点就属于哪个类别。
二、K近邻算法的计算步骤
1. K近邻算法的代码实现
代码如下(示例):
import pandas as pd
# 首先读取原始数据
df = pd.read_excel("葡萄酒.xlsx")
# 提取特征变量和目标变量
X_train = df[["酒精含量(%)","苹果酸含量(%)"]]
y_train = df["分类"]
# 直接调用Python相关库来进行K近临算法的运算
from sklearn.neighbors import KNeighborsClassifier as KNN
# 创建模型并设置邻近参数n_neighbors,也就是K值,这里设置值为3,即选取最近的是3个样本,如果不设置则取默认值5
knn = KNN(n_neighbors=3)
knn.fit(X_train,y_train)
X_test = [[7,1]] # X_test为测试集的特征变量
answer = knn.predict(X_test)
print(answer) # 输出结果:[0]
X_test2 = [[7,1],[8,3],[10,5],[6,10]]
answer2 = knn.predict(X_test2)
print(answer2)
# 输出结果:[0 1 1 1]
2.K近邻算法回归模型
代码如下(示例):
# K邻近算法回归模型
from sklearn.neighbors import KNeighborsRegressor
X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [1,2,3,4,5]
model = KNeighborsRegressor(n_neighbors=2)
model.fit(X,y)
print(model.predict([[5,5]]))
# 输出结果:[2.5]
3.案例实战:手写数字识别模型
(1)手写数字识别原理:
- 1.图像二值化
将图片格式的数字4转换成由0和1组成的“新的数字4”,这是一个32X32的矩阵,数字1代表有颜色的地方,数字0代表无颜色的地方,这样就完成了手写数字是别的的第一步也是最关键的一步:将图片转换为计算机能识别的内容-----数字0和数字1.这个步骤又称图像二值化。 - 2.二维数组转换为一位数组
经过图像二值化处理获得的32X32的0-1矩阵相当于一个二维数组,为了方便进行机器学习建模,还需要对这个二位数组进行简单的处理:在第1行数字之后依次拼接第2–32行的数字,得到一个1X1024的一维数组。这样便把一个图片格式的数字4转换为一个有1024个元素的一位数组。对于其他图片格式的数字也可以进行类似处理。利用这种一维数组就可以计算不同手写数字之间的距离,或者说这些手写数字的相似度,从而进行手写数字识别。 - 3.距离计算
手写数字图片处理后形成的1X1024的二维数组可以看成一个行向量两张图片对应的行向量见的欧氏距离可以反映两张图片的相似度。因此,我们可以利用K近邻算法模型计算新样本与原始训练集中各个样式的欧氏距离,取新样本的K个近邻点,并以大多数近邻点所在的分类作为新样本的分类。
代码如下(示例):
(2)手写数字识别的代码实现
1.读取数据
import pandas as pd
df = pd.read_excel("手写字体识别.xlsx")
2.提取特征变量和目标变量
# 设置特征变量和目标变量
X = df.drop(columns="对应数字")
y = df["对应数字"]
from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(X)
3.划分训练集合测试集
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123)
4.模型搭建
# 模型搭建
from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors=5)
# fit()函数进行模型的训练,传入的参数正是前面划分好的训练集数据X_train、y_train
knn.fit(X_train,y_train)
5.模型测试与评估
# 模型预测与评估
y_pred = knn.predict(X_test)
a = pd.DataFrame() # 创建一个空DataFrame
a["预测值"] = list(y_pred)
a["实际值"] = list(y_test)
# print(a.head())
# 查看对整个测试集的预测准确度
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred,y_test)
# print(score)
# K近邻算法分类模型自带评分功能
socre = knn.score(X_test,y_test)
# print(socre)
(3)图像识别原理详解
1.图片大小调整及显示
# (1)图片提取、大小调整与灰度处理
from PIL import Image
img = Image.open("测试图片.png")
# resize()函数可以调整图像大小,这里调整为32X32像素
img = img.resize((32,32))
# img.show()
2.图片灰度处理
# 对原始图片进行灰度处理
img = img.convert("L")
# img.show()
3.图片二值化
# (2)图片二值化,二维数组转一维数组
# 引入numpy库,为之后将图像转换为二维数组做准备
import numpy as np
# point()函数可以操控每一个像素点
# 将偏白色的区域赋值为0,原来偏黑色的区域赋值为1,这样便完成了将颜色转换为数字0和1的工作
img_new = img.point(lambda x:0 if x>128 else 1)
arr = np.array(img_new)
4.将二维数组转换为一维数组
# 上面获得的32X32的二维数组不能用于数据建模,因此还需用reshape(1,-1)函数将其转换为一行
# 将二维数组转换为一位数组
arr_new = arr.reshape(1,-1)
5.进行预测
# 进行预测
answer = knn.predict(arr_new)
print("图片中的数字为: "+str(answer[0]))
完整代码汇总:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 1.训练模型 2.处理图片 3.进行预测
# (1)读取数据
import pandas as pd
df = pd.read_excel("手写字体识别.xlsx")
# (2)提取特征变量和目标变量
X = df.drop(columns="对应数字")
y = df["对应数字"]
# (3)划分训练集合测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123)
# (4)搭建并训练模型
from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors=5)
knn.fit(X_train,y_train)
# 2.处理图片
# (1)图片提取、大小调整与灰度处理
from PIL import Image
img = Image.open("测试图片.png")
# resize()函数可以调整图像大小,这里调整为32X32像素
img = img.resize((32,32))
img.show()
# 对原始图片进行灰度处理
img = img.convert("L")
img.show()
# (2)图片二值化,二维数组转一维数组
# 引入numpy库,为之后将图像转换为二维数组做准备
import numpy as np
# point()函数可以操控每一个像素点
# 将偏白色的区域赋值为0,原来偏黑色的区域赋值为1,这样便完成了将颜色转换为数字0和1的工作
img_new = img.point(lambda x:0 if x>128 else 1)
arr = np.array(img_new)
# for i in range(arr.shape[0]):
# print(arr[i])
# 上面获得的32X32的二维数组不能用于数据建模,因此还需用reshape(1,-1)函数将其转换为一行
# 将二维数组转换为一位数组
arr_new = arr.reshape(1,-1)
# 3.进行预测
answer = knn.predict(arr_new)
print("图片中的数字为: "+str(answer[0]))
总结
参考书籍:《Python大数据分析与机器学习商业案例实战》