K近邻算法(KNN)

1.简介

机器学习流程

1.获取数据集
2.数据基本处理
3.特征工程
4.机器学习
5.模型评估

 Scikit-learn工具

安装

pip3 install scikit-learn

查看是否安装成功

import sklearn

API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数

 简单使用

from sklearn.neighbors import KNeighborsClassifier

# 可以把x理解为 excel 表格中一列,每一行就是一个样本
# 只不过这里样本比较简单,只是一维的

x = [[0],
     [1],
     [2],
     [3]]
y = [0, 0, 1, 1]

# 实例化API
estimator = KNeighborsClassifier(n_neighbors=1)
# 使用fit方法进行训练\
# fit函数需要传递两个值,一个特征值,一个目标值
estimator.fit(x, y)

# predict 预测函数
print(estimator.predict([
    [1],
    [100]
]))

常见距离公式 

欧式距离

曼哈顿距离

切比雪夫距离

闵可夫斯基距离

K值的选择

  • K值过小
    • 容易受到异常点的影响
    • 容易过拟合
  • k值过大:
    • 受到样本均衡的问题
    • 容易欠拟合

 KD树

 scikit-learn数据集API介绍

案例一

from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
# 返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 获取鸢尾花数据集
iris = load_iris()
# 把数据转换成dataframe的格式
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target

def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花种类分布图')
    plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

K近邻算法(KNN)

数据集划分api 

 

  • sklearn.model_selection.train_test_split(arrays, *options)
    • 参数:
      • x 数据集的特征值
      • y 数据集的标签值
      • test_size 测试集的大小,一般为float
      • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
    • return
      • x_train, x_test, y_train, y_test
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 1、获取鸢尾花数据集
iris = load_iris()
# 对鸢尾花数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("x_train:\n", x_train.shape)
print("y_train:\n", y_train.shape)
print("x_test:\n", x_test.shape)
print("y_test:\n", y_test.shape)
# 随机数种子
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种子不一致:\n", x_train == x_train1)
print("如果随机数种子一致:\n", x_train1 == x_train2)

 特征预处理

归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

 

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

data = pd.read_csv("./data/dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、调用fit_transform
data1 = transfer.fit_transform(data[['milage','Liters','Consumtime']])
data2= transfer.fit_transform(data[:])
print("最小值最大值归一化处理的结果:\n", data1)
print(data1.shape)
print("最小值最大值归一化处理的结果:\n", data2)
print(data2.shape)

 标准化

import pandas as pd
from sklearn.preprocessing import StandardScaler

"""
标准化演示
"""
data = pd.read_csv("./data/dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)

上一篇:拓端tecdat|R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据集


下一篇:机器学习(四)