一、K-近邻算法
K近邻算法在机器学习中是最为容易理解的一类算法,这类算法的中心思想就是就是计算未知的样本与已知样本的在特征空间中的距离,通过距离的运算来取K个与之最近距离的样本,如果这K个样本的大多数属于某一类别,则此未知样本则属于该类别。
(一)、欧式距离计算方法
在文章开头说明的特征空间的距离转化到数学上来说就是欧式距离。
假设有两个样本,每个样本有3个特征,分别为a(a1,a2,a3);b(b1,b2,b3)。则这两个样本在特征空间的距离(欧式距离)公式如下:
通常情况下,相同类型的样本下的相同特征值往往是很接近的,即在式中所对应的两个特征值之间的差相对较小,故相似样本地欧式距离相对较小。
(二)、前期处理
结合之前的标准化所解决的问题来看,欧拉公式受特征之间的数值量级的影响较大,故在使用此算法时需要对数据进行标准化处理来减少样本之间的影响。
(三)、API样例说明
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd
def data_precess():
"""
对原始数据进行处理
:return: None
"""
# 导入数据
data = pd.read_csv("./ins/train.csv/train.csv")
# print(data.head(10))
# 筛选数据中的准确率
data = data.query("50<accuracy").copy()
# print(data)
# 对时间戳进行处理,将时间戳转化为年月日时分秒的格式
time_value = pd.to_datetime(data["time"], unit="s")
# data["time_value"] = time_value
# 提取日,周几,小时的信息
data["hour"] = time_value.dt.hour
data["day"] = time_value.dt.day
data["weekday"] = time_value.dt.weekday
data = data.drop(["time", ], axis=1)
# print(data.head(10))
# 去除打卡次数小于指定次数的id
place_count = data.groupby("place_id").count()
# 设定去除特征“place_id”出现少于特定次数的样本,并将w放回样本特征一列中
a = place_count[place_count.row_id > 5].reset_index()
# 在原始数据中进行搜索,并保留符合要求的样本
data = data[data["place_id"].isin(a.place_id)]
# print("最终数据的结果为:", "\n", data)
return data
def feature_engineering():
"""
对数据进行特征工程的处理
:return:
x_train:训练集特征值
x_test:测试集特征值
y_train:训练集目标值
y_test:测试集目标值
"""
data = data_precess()
# 提取出目标值
y = data["place_id"]
# 提取出特征值
x = data.drop(["place_id"], axis=1)
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
"""函数参数解释:
函数中第一个元素为数据集的特征值
函数中第二个元素为数据集的目标值
test_size为数据集划分后测试集所占比例
函数输出解释:
函数输出的顺序为训练集的特征值、测试集的特征值、训练集的目标值、测试集的目标值
"""
# 开始标准化
result = StandardScaler()
x_train = result.fit_transform(x_train)
x_test = result.transform(x_test)
# print(result_data)
return x_train, x_test, y_train, y_test
def knn():
"""
用knn进行建模
:return:
"""
x_train, x_test, y_train, y_test = feature_engineering()
# 实例化knn算法
k_nn = KNeighborsClassifier(n_neighbors=5)
# fit
k_nn.fit(x_train, y_train)
# predict输出预测结果
y_predice = k_nn.predict(x_test)
print("预测结果为:", y_predice)
# score得出准确率
y_score = k_nn.score(x_test, y_test)
print("预测的准确率为:", y_score)
if __name__ == "__main__":
knn()
(四)、优缺点分析:
通过了解k近邻算法的过程中,我们发现这个算法计算过程相对简单,没有太多了参数需要调节,也不需要进行迭代训练,相比于其他算法来说更易于训练一些,但是随之而来的就是受异常数据的影响相对较大,同时也受k的数值设定影响较大,在预测过程中对硬件的开销相对较大。综上该算法只适用于小样本分析,对于样本过大的场景不宜使用此样本。