今天来看看KNN分类算法的python实现。
算法流程设计:
1、获取数据,了解和处理数据的结构,这里不管是分类算法还是回归算法,都需要提前获得训练集的分类属性。
2、将数据随机分为测试集和预测集
3、距离函数
4、邻近的样本选取
5、预测
6、检查该算法的准确率。
1-6中,重点在3-5环节。其他环节都是比较固定的。
import
matplotlib
.
pyplot
as
plt
from
sklearn
import
datasets
import
statsmodels
.
api
as
sm
from
random
import
randrange
数据集还是用IRIS
iris
=
sm
.
datasets
.
get_rdataset
(
'iris'
).
data
iris
.loc[:,
'Species'
]=
iris
.loc[:,
'Species'
].apply(
replace
)
我们把三个常用的距离写在一个函数下面,通过改变参数来切换距离计算公式。分别是曼哈顿距离、欧式距离、闵科夫斯基距离。
def
distance
(
row1
,
row2
,
p
=
2
):
# p 的取值是1,2,3
for
i
in
range
(
len
(
row1
)-
1
):
distance
.
append
(
abs
(
row1
[
i
]-
row2
[
i
]))
distance1
=
max
(
distance
)
for
i
in
range
(
len
(
row1
)-
1
):
distance
+=
abs
(
row1
[
i
]-
row2
[
i
])**
p
distance1
=
pow
(
distance
,
1
/
p
)
对应的计算公式
我们选取欧氏距离来计算,下面接着再看看,如何选择邻近的样本点
def
get_neighbors
(
train
,
test_row
,
num_neighbors
):
#获取K个相邻样本 K = num_neighbors
dist
=
distance
(
test_row
,
train_row
,
p
=
2
)
distances
.
append
((
train_row
,
dist
))
distances
.
sort
(
key
=
lambda
tup
:
tup
[
1
])
# 根据元组的第二项dist排序
for
i
in
range
(
num_neighbors
):
neighbors
.
append
(
distances
[
i
][
0
])
# 完成排序后选取前K个行
K 值的确定,目前是人工设定的。后续可以添加对K 值确认的算法。
再来看看如何预测
def
predict_classification
(
train
,
test_row
,
num_neighbors
):
neighbors
=
get_neighbors
(
train
,
test_row
,
num_neighbors
)
output_values
=[
row
[-
1
]
for
row
in
neighbors
]
prediction
=
max
(
set
(
output_values
),
key
=
output_values
.
count
)
下面给个样本,检测下预测的结果
下面通过数据集的随机分类来交叉检查预测的准确率
def
k_nearest_neighbors
(
train
,
test
,
num_neighbors
):
output
=
predict_classification
(
train
,
row
,
num_neighbors
)
predictions
.
append
(
output
)
这个函数和上面的预测函数的区别是这个支持多个样本的预测。
def
accuracy_metric
(
actual
,
predicted
):
for
i
in
range
(
len
(
actual
)):
if
actual
[
i
] ==
predicted
[
i
]:
return
correct
/
float
(
len
(
actual
))*
100.0
def
class_test
(
dataset
,
n_folds
):
dataset_copy
=
list
(
dataset
)
fold_size
=
int
(
len
(
dataset
)/
n_folds
)
for
i
in
range
(
n_folds
):
while
len
(
fold
)<
fold_size
:
index
=
randrange
(
len
(
dataset_copy
))
fold
.
append
(
dataset_copy
.
pop
(
index
))
dataset_split
.
append
(
fold
)
def
evaluate_algorithm
(
dataset_split
,
algorithm
,*
args
):
for
i
in
range
(
len
(
dataset_split
)):
train_set
=
list
(
dataset_split
)
train_set
=
sum
(
train_set
, [])
for
row
in
dataset_split
[
i
]:
test_set
.
append
(
row_copy
)
predicted
=
algorithm
(
train_set
,
test_set
, *
args
)
actual
= [
row
[-
1
]
for
row
in
dataset_split
[
i
]]
accuracy
=
accuracy_metric
(
actual
,
predicted
)
scores
.
append
(
accuracy
)
以上为KNN分类算法的基本逻辑。中间的K值,距离的选取,都是比较随意地,距离度量的学习这部分,会在后面再介绍。
而在量化风险管理中重点就是要对每一个参数的设定,给出充分的理由。今后为了精简文章,突出重点,把随机分类,检测这部分就不再赘述。
独立专业中立的产品评测
多年数据挖掘与建模经验
,工作跨大数据、营销、风控、运营多个领域
擅长诊断各类业务问题
结合企业全面风险管理和精算数据科学
为企业构建和完善企业风险预警指标体系
协助企业更好实现战略目标及业务绩效目标
培训 | 咨询 | 分析 | 建模