大家好,我是ly甲烷😜,后端开发也有做算法的心呀💗 ,我们来学习python机器学习
github有37.1k star的机器学习100天原项目地址https://github.com/Avik-Jain/100-Days-Of-ML-Code
之前的机器学习100天有很多库或者函数已经不用了,还有刚入门机器学习可能很多函数或者设置搞不明白,
所以,从python基础无缝到机器学习的教程来了。博主亲自操作一遍过的记录,绝对细致。如果学不会可以评论区讨论,如果我懂,我会回复的。

今天是机器学习第五天——K近邻算法 👇 👇 👇,前一天——逻辑回归。

数据集

链接:https://pan.baidu.com/s/1Y2vZ5Rvn2PpRkj9XhnZrXQ?pwd=yyds
提取码:yyds

今日目标

和昨天一样,数据集合包括人们的编号、性别、年龄、估算工资、和是否购买某个东西
在这里插入图片描述
这次通过KNN模型训练数据,实现从人们的年龄和其估算工资来预测其是否会购买某个东西。看看两个模型有什么不同

相关概念

昨天我们用逻辑回归处理了这个简单的0、1分类问题。逻辑回归主要是和数学上概率分布相关的,核心算法是线性模型
今天我们用 K-近邻算法模型。

K-近邻算法

K-近邻算法是一种基本分类和回归方法。详细可以看:【机器学习原理】KNN分类算法
简单来说,KNN是靠多数表决来进行分类的。
训练集已经给好标签了,然后再来一个新的进行预测,新的特征和之前训练集的特征更接近,就把他们分为一类。
举个例子:物以类聚,人一群分,现在我们已知一些人属于A圈子,另一些人属于B圈子。现在有一个新的人,没见过,怎么判断他是属于A圈子的还是B圈子的。 我们可以看他朋友是哪个圈子(离哪个圈子更近),那我们就把他归为这个圈子。

实现过程

经过这么多天,相信大家对这个过程很熟悉了,就不一步一步来了。

1.导入数据集 —— 2.数据预处理 —— 3.使用K-NN对训练集进行训练——4.预测——5.可视化

# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 导入数据集
dataset = pd.read_csv(r'E:\workspace\python_workspace\datasets\Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
Y = dataset.iloc[:, 4].values

# 将数据划分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25, random_state=0)

# 特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# 使用K-NN对训练集数据进行训练
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2) # p=2:使用欧式距离; metric='minkowski':用于树的距离度量。默认度量是 minkowski,并且 p=2 等效于标准欧几里得度量;
classifier.fit(X_train, Y_train)

# 对测试集进行预测
Y_pred = classifier.predict(X_test)

# 生成混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(Y_test, Y_pred)

# 可视化
from matplotlib.colors import ListedColormap
X_set, Y_set = X_train, Y_train
X1, X2 = np.meshgrid(np.arange(start=X_set[:, 0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                     np.arange(start=X_set[:, 1].min()-1, stop=X_set[:, 1].max()+1, step=0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha=0.75, cmap=ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(Y_set)):
    plt.scatter(X_set[Y_set == j, 0], X_set[Y_set == j, 1],
                c=ListedColormap(('red', 'green'))(i), label=j)

plt.title(' K-NN(Training set)')
plt.xlabel(' Age')
plt.ylabel(' Estimated Salary')
plt.legend()
plt.show()

X_set, Y_set = X_test, Y_test
X1, X2 = np.meshgrid(np.arange(start=X_set[:, 0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                     np.arange(start=X_set[:, 1].min()-1, stop=X_set[:, 1].max()+1, step=0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha=0.75, cmap=ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(Y_set)):
    plt.scatter(X_set[Y_set == j, 0], X_set[Y_set == j, 1],
                c=ListedColormap(('red', 'green'))(i), label=j)

plt.title(' K-NN(Test set)')
plt.xlabel(' Age')
plt.ylabel(' Estimated Salary')
plt.legend()
plt.show()

函数讲解

昨天也是这些函数:
np.arange():函数返回一个有终点和起点的固定步长的排列,如[1,2,3,4,5],起点是1,终点是6,步长为1。
np.meshgrid(): 生成网格点坐标矩阵。numpy.meshgrid()理解
plt.contourf(): 用来画红绿两种结果的分界线, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),这个是利用逻辑回归模型预测分界线。

.ravel(): 将多维数组降为一维数组。
T: 实现数组转置和轴对换。
.reshape: A.reshape(X1.shape)将A的类型重塑为X1的shape。

plt.xlim: 设置x坐标轴范围。
plt.ylim: 设置y坐标轴范围。
unque(): 是一个去重函数。
enumerate: 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

可视化结果

训练集分类结果可视化:
在这里插入图片描述
测试集分类结果可视化:
在这里插入图片描述


今日总结:
K-近邻算法, 就是距离那类更近就分给哪类


今天就到这里啦,如果不懂,可以调试调试,看看变量是怎么变的,有不足和错误的地方欢迎大家指正👐
大家可以在评论区留下足迹👍 💬 ⭐️、留下遇到的问题哦。或者你也可以记录学习博客,留下你的博客地址
每天半小时,100天打卡挑战,让我们学会机器学习~💖

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐