K-近邻近算法

  • 定义
    • 通过你的邻居来判断你属于哪个类别
    • 一般使用欧式距离
    • scikit-learn
  • 优点
    • 简单有效
    • 重新训练的代价低
    • 适合类域交叉样本
    • 适合大样本的自动分类
  • 缺点
    • 惰性学习
    • 类别评分不是规格化
    • 输出可解释性不强
    • 对不均衡的样本不擅长
      • 样本不均衡:收集到的数据每个类别占比失衡
    • 计算量较大
  • API
	sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
	from sklearn,neighbors import KNeighborsClassifier
	estimator = KNeighborsClassifier(n_neighbors=2,algorithm='auto')
	estimator.fit(x,y)
	print(estimator.predict([[1]]))
  • 标准差

    • 方差的平方根
    • 方差 1/n和(xi - x平均值)的平方
  • 距离度量

    • 欧式距离 :通过距离平方值进行计算
    • 曼哈顿距离(Manhattan Distance): 通过距离的绝对值进行计算
    • 切比雪夫距离(Chebyshev Distance) :维度的最大值进行计算
    • 闵可夫斯基距离(Mi nkowski Distance) :
      • 当p=1时,就是曼哈顿距离;
      • 当p=2时,就是欧氏距离;
      • 当p=∞时,就是切比雪夫距离。
    • 小结:前面四个距离公式都是把单位相同看待了,所以计算过程不是很科学
    • 标准化欧氏距离(Standardized EuclideanDistance) :
      • 在计算过程中添加了标准差,对量刚数据进行处理
    • 余弦距离(Cosine Distance)
      • 通过cos思想完成
    • 汉明距离(Hamming Distance)[了解] :
      • -个字符串到另-个字符串需要变换几个字母,进行统计
    • 杰卡德距离(Jaccard Distance)[了解] :
      • 通过交并集进行统计
    • 马氏距离(Mahalanobis Distance) [了解]
      • 通过样本分布进行计算
  • k值的选择

    • 近似误差–过拟合 --在训练集正表现好,测试集表现不好
    • 估计误差 对测试集的测试误差 误差小说明对未知数据预测能力好
    • k值小 意味模型变得复杂 容易发生过拟合 易受到异常点的影响
    • k值大 模型变得简单 受到样本均衡问题
  • kd树

    • 构建树
    • 最近领域搜索
    • 样本集:{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
    • 一、构建树
      • 第一次:
        • x轴-- 2,5,9,4,8,7 --> 2,4,5,7,8,9
        • y轴-- 3,4,6,7,1,2 --> 1,2,3,4,6,7
        • 首先选择x轴,找中间点,发现是(7,2)
      • 第二次:
        • 左面: (2,3), (4,7), (5,4) --> 3,4,7
        • 右面: (8,1), (9,6) --> 1,6
        • 从y轴开始选择,
        • 左边选择点是(5, 4),右边选择点(9, 6)
      • 第三次:
        • 从x轴开始选择
    • 二、搜索
      • 在本域内,没有进行跨域搜索
      • 要跨到其他域搜索
  • 获取数据集 sklearn. datasets .

    • 小数据: sklearn.datasets.load_* 注意: 该数据从本地获取
    • 大数据集: sklearn. datasets. fetch_ * 该数据从网上下载
    • sklearn. datasets. fetch_ (subset=‘train’)–表示获取到的数据集类型 train test all
  • 数据集返回值介绍

    • 类型是bunch 一个字典类型
    • data 特征数据数组
    • target 目标数组
    • feature_names 特征名称
    • target_names 目标名称
    • DESCR 数据描述
  • 数据可视化

    • import seaborn
    • sns.lmplot(x=col1,y=col2,data=iris,hue=‘target’,fit_reg=True)
    • x、y具体x轴、y轴数据的索引值
    • hue 目标值
    • fit_reg 是否进行线性拟合
  • 数据划分

    • from sklearn.model_selection import train_test_split
    • train_test_split(x=特征值,y=目标值,test_size=测试集大小,random_state=随机数种子)
    • 返回值:x_train,x_test,y_train,y_test
  • 特征工程

    • 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
    • 归一化
      • x’=(x-min)/(max-min) x’’=x’(mx-mi)+mi mx=1 mi=0
      • 对原始数据进行变化 把数据映射到(默认[0,1])之间
      • from sklearn.preprocessing import MinMaxScaler
      • MinMaxScaler(feature_range=(0,1)) 创建实例化个体 指定范围
      • 鲁棒性差,易受到异常点影响 只适合传统精确小数据
    • 标准化
      • 对原始数据变换成均值为0,标准差为1范围内
      • x’ = (x-x_mean)/x_std 数据-平均值 /标准差
      • from sklearn.preprocessing import StandardScaler
      • 异常值影响小
  • 交叉验证

    • 将拿到的训练数据,分为训练和验证集
    • 几折交叉验证
    • 训练集:训练集+验证集 测试集:测试集
    • 不能提高模型的准确性
    • 为了让被评估的模型更加准确可信
  • 网格搜索

    • 超参数 sklearn中需要手动指定的参数
      • 网格搜索就是把这些超参数的值,通过字典的形式传递进去,选择最优
	sklearn.model_selection.GridSearchCV(estimator,param_grid=,cv=)
	estimator:估计器对象
	param_grid:估计器参数(dict){'n_neighbors':[1,3,4]}
	cv:指定几折
	fit : 输入训练数据
	score:准确率
	
	结果分析:
	 bestscore_:交叉验证中最好的结果
	 bestestimator_:最好的参数模型
	 cv_results_:每次交叉验证后的验证集准确率和训练集准确率
  • from sklearn.neighbors import KNeighborsClassifier
  • estimator = KNeighborsClassifier(n_neighbors=2,algorithm=‘auto’)
  • algorithm = ‘auto’ 自己选择 ‘kd_tree’ 树形数据结构 ‘ball_tree’ 特征值维数超过20 ‘brute’ 暴力
  1. 获取数据集
  2. 数据基本处理
  3. 特征工程
  4. 机器学习
  5. 模型评估
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=1)

transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

estimator = KNeighborsClassifier(n_neighbors=5,algorithm='auto')
param_grid = {'n_neighbors':[1,3,5,7,9]}
estimator = GridSearchCV(estimator,param_grid=param_grid,cv=5,n_jobs=10)
estimator.fit(x_train,y_train)

y_pre = estimator.predict(x_test)
estimator.score(x_test,y_test)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐