vlambda博客
学习文章列表

KNN分类算法的python实现

今天来看看KNN分类算法的python实现。


算法流程设计:


1、获取数据,了解和处理数据的结构,这里不管是分类算法还是回归算法,都需要提前获得训练集的分类属性。


2、将数据随机分为测试集和预测集


3、距离函数


4、邻近的样本选取


5、预测


6、检查该算法的准确率。


1-6中,重点在3-5环节。其他环节都是比较固定的。


import numpy as np
import pandas as pd
import matplotlib . pyplot as plt
from sklearn import datasets
from sklearn import tree
import matplotlib
import   statsmodels . api as sm
from random import seed
from random import randrange
from csv import reader
from math import sqrt


数据集还是用IRIS 


iris = sm . datasets . get_rdataset ( 'iris' ). data

iris .loc[:, 'Species' ]= iris .loc[:, 'Species' ].apply( replace )

dataset = iris .values


我们把三个常用的距离写在一个函数下面,通过改变参数来切换距离计算公式。分别是曼哈顿距离、欧式距离、闵科夫斯基距离。


def distance ( row1 , row2 , p = 2 ): # p 的取值是1,2,3
       
    if p == 3 :
       
        distance = list ()

        for   i in range ( len ( row1 )- 1 ):

            distance . append ( abs ( row1 [ i ]- row2 [ i ]))
       
        distance1 = max ( distance )

    else :

        distance = 0.0        

        for   i in range ( len ( row1 )- 1 ):

            distance += abs ( row1 [ i ]- row2 [ i ])** p

        distance1 = pow ( distance , 1 / p )
       
    return   distance1


对应的计算公式


KNN分类算法的python实现



我们选取欧氏距离来计算,下面接着再看看,如何选择邻近的样本点


def get_neighbors ( train , test_row , num_neighbors ):

    #获取K个相邻样本 K = num_neighbors

    distances = list ()

    for train_row in train :

        dist = distance ( test_row , train_row , p = 2 )

        distances . append (( train_row , dist ))

    distances . sort ( key = lambda tup : tup [ 1 ]) # 根据元组的第二项dist排序

    neighbors = list ()

    for i in range ( num_neighbors ):

        neighbors . append ( distances [ i ][ 0 ]) # 完成排序后选取前K个行

    return neighbors


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 )

    return prediction


下面给个样本,检测下预测的结果


KNN分类算法的python实现


下面通过数据集的随机分类来交叉检查预测的准确率


def k_nearest_neighbors ( train , test , num_neighbors ):

    predictions = list ()

    for row in test :

        output = predict_classification ( train , row , num_neighbors )

        predictions . append ( output )

    return ( predictions )


这个函数和上面的预测函数的区别是这个支持多个样本的预测。


def accuracy_metric ( actual , predicted ):

    #计算预测的准确率

    correct = 0

    for i in range ( len ( actual )):

        if actual [ i ] == predicted [ i ]:

            correct += 1

    return correct / float ( len ( actual ))* 100.0


def class_test ( dataset , n_folds ):

    #将数据集随机分为类
     
    dataset_split = list ()

    dataset_copy = list ( dataset )

    fold_size = int ( len ( dataset )/ n_folds )

    for i in range ( n_folds ):

        fold = list ()

        while len ( fold )< fold_size :

            index = randrange ( len ( dataset_copy ))

            fold . append ( dataset_copy . pop ( index ))
       
        dataset_split . append ( fold )

    return dataset_split


def evaluate_algorithm ( dataset_split , algorithm ,* args ):

    #样本交叉预测并给出评分

    scores = list ()

    for i in range ( len ( dataset_split )):  

        train_set = list ( dataset_split )                

        train_set . pop ( i )    

        train_set = sum ( train_set , [])

        test_set = list ()

        for row in dataset_split [ i ]:
       
            row_copy = list ( row )          
           
            row_copy [- 1 ] = None

            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 )

    return scores



以上为KNN分类算法的基本逻辑。中间的K值,距离的选取,都是比较随意地,距离度量的学习这部分,会在后面再介绍。


而在量化风险管理中重点就是要对每一个参数的设定,给出充分的理由。今后为了精简文章,突出重点,把随机分类,检测这部分就不再赘述。


End



独立专业中立的产品评测

多年数据挖掘与建模经验

,工作跨大数据、营销、风控、运营多个领域

擅长诊断各类业务问题

结合企业全面风险管理和精算数据科学

为企业构建和完善企业风险预警指标体系

协助企业更好实现战略目标及业务绩效目标


培训 | 咨询 | 分析 | 建模



分享 收藏 点赞 在看