大家好,我是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)
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5, metric='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天打卡挑战,让我们学会机器学习~💖
|