Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
1、K-近邻算法(KNN)
1.1 定义
(KNN,K-NearestNeighbor)
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
1.2 距离公式
两个样本的距离可以通过如下公式计算,又叫欧式距离。
简单理解这个算法:
这个算法是用来给特征值分类的,是属于有监督学习的领域,根据不断计算特征值和有目标值的特征值的距离来判断某个样本是否属于某个目标值。
可以理解为根据你的邻居来判断你属于哪个类别。
1.3 API
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
- n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
- algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
- 其中的你指定的邻居个数实际上是指的当算法计算完一个样本的特征值距离所有其他样本的目标值的距离之后,会根据距离的大小排序,而你的指定的这个参数就是取前多少个值作为判定依据。
- 比如说你指定邻居是5那么如果5个邻居里3个是爱情片,那么可以说这个样本属于爱情片。
1.4 案例(预测签到位置)
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import pandas as pd
def knncls():
"""
K近邻算法预测入住位置类别
row\_id,x,y,accuracy,time,place\_id
用户ID,坐标x,坐标y,准确度,时间,位置ID
:return:
"""
# 一、处理数据以及特征工程
# 1、读取收,缩小数据的范围
data = pd.read_csv("./train.csv")
# 数据逻辑筛选操作 df.query()
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
# 删除time这一列特征
data = data.drop(['time'], axis=1)
print(data)
# 删除入住次数少于三次位置
place_count = data.groupby('place\_id').count()
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data['place\_id'].isin(tf.place_id)]
# 3、取出特征值和目标值
y = data['place\_id']
# y = data[['place\_id']]
x = data.drop(['place\_id', 'row\_id'], axis=1)
# 4、数据分割与特征工程?
# (1)、数据分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
# (2)、标准化
std = StandardScaler()
# 队训练集进行标准化操作
x_train = std.fit_transform(x_train)
print(x_train)
# 进行测试集的标准化操作
x_test = std.fit_transform(x_test)
# 二、算法的输入训练预测
# K值:算法传入参数不定的值 理论上:k = 根号(样本数)
# K值:后面会使用参数调优方法,去轮流试出最好的参数[1,3,5,10,20,100,200]
knn = KNeighborsClassifier(n_neighbors=1)
# 调用fit()
knn.fit(x_train, y_train)
# 预测测试数据集,得出准确率
y_predict = knn.predict(x_test)
print("预测测试集类别:", y_predict)
print("准确率为:", knn.score(x_test, y_test))
return None
if __name__ == '\_\_main\_\_':
print()
返回结果:
row_id x y accuracy place_id
600 600 1.2214 2.7023 17 6683426742
957 957 1.1832 2.6891 58 6683426742
4345 4345 1.1935 2.6550 11 6889790653
4735 4735 1.1452 2.6074 49 6822359752
5580 5580 1.0089 2.7287 19 1527921905
... ... ... ... ... ...
29100203 29100203 1.0129 2.6775 12 3312463746
29108443 29108443 1.1474 2.6840 36 3533177779
29109993 29109993 1.0240 2.7238 62 6424972551
29111539 29111539 1.2032 2.6796 87 3533177779
29112154 29112154 1.1070 2.5419 178 4932578245
[17710 rows x 5 columns]
[[-0.39289714 -1.20169649 0.03123826]
[-0.52988735 0.71519711 -0.08049297]
[ 0.84001481 0.82113447 -0.73225846]
...
[-0.64878452 -0.59040929 -0.20153513]
[-1.37250642 -1.33053923 -0.44361946]
[-0.11503962 -1.30477068 -0.22946794]]
预测测试集类别: [4932578245 3312463746 8048985799 ... 1285051622 2199223958 678038