数据挖掘07--K近邻算法

目录

获取数据集

sklearn数据集返回值介绍

查看数据分布 ——是否可分

数据集的划分

 特征预处理定义

1. 归一化

2. 标准化

K-近邻算法API

交叉验证,网格搜索(模型选择与调优)API:

鸢尾花案例增加K值调优


机器学习数据挖掘通用流程

1.获取数据集

2.数据基本处理(该案例中省略)

3.特征工程(该案例中省略)

4.机器学习或数据挖掘

5.模型评估(该案例中省略)

# 1.获取数据集
#list
x = [[1,2],[2,3],[50,30],[54,32]]
y = [0,0,1,1]

#ndarry数据
# import numpy as np 
# x=np.array([[1,2],[2,3],[50,30],[54,32]])
# y=np.array([0,0,1,1])

#DataFrame数据
# import pandas as pd
# data=pd.DataFrame([[1,2,0],[2,3,0],[50,30,1],[54,32,1]],columns=["X1","X2","Y"])
# x=data[["X1","X2"]]
# y=data[["Y"]]

print(x)
print(y)
# 2.数据基本处理(该案例中省略)
# 3.特征工程(该案例中省略)
# 4.机器学习或数据挖掘
from sklearn.neighbors import KNeighborsClassifier
estimator=KNeighborsClassifier(n_neighbors=2)
estimator.fit(x, y)
estimator.predict([[3,3]])
# 5.模型评估(该案例中省略)

获取数据集

sklearn.datasets 加载获取流行数据集

  • datasets.load_*() ** 获取小规模数据集,数据包含在datasets里
  • datasets.fetch_*(data_home=None) ** 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/

sklearn数据集返回值介绍

load和fetch返回的数据类型datasets.base.Bunch(字典格式)

  • data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
  • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
  • DESCR:数据描述
  • feature_names:特征名,新闻数据,手写数字、回归数据集没有
  • target_names:标签名
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
#print("鸢尾花数据集的返回值:\n", iris)
print("-------------------")
# 返回值是一个继承自字典的Bench
#print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
#print("鸢尾花的描述:\n", iris.DESCR)

查看数据分布 ——是否可分

通过创建一些图,以查看不同类别是如何通过特征来区分的。 在理想情况下,标签类将由一个或多个特征对完美分隔。 在现实世界中,这种理想情况很少会发生。

seaborn介绍

Seaborn 是基于 Matplotlib 核心库进行了更高级的 API 封装,可以让你轻松地画出更漂亮的图形。而 Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。

seaborn.lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合 sns.lmplot() 里的 x, y 分别代表横纵坐标的列名, data= 是关联到数据集, hue=*代表按照 species即花的类别分类显示, fit_reg=是否进行线性拟合。

数据集的划分

众所周知,建立数据模型的目的,一方面是用于描述和反映事物各变量之间的内在结构关系,另一方面是用于对未来新数据的预测。 预测模型应重点关注模型的预测精度或模型误差,误差较小的模型在未来预测中会表现得更好。

计算模型的真实误差是数据挖掘无法回避的问题。所谓模型的真实误差,是指模型在总体(全部数据)上的预测误差。如果能够获得全部数据,计算真实误差便是轻而易举的事情。但遗憾的是,通常人们无法得到总体,只能得到总体中的部分数据.即样本。 那么,如何得到模型真实误差的准确估计?

比较自然的想法是,将模型在样本上的误差作为模型真实误差的估计,遗憾的是,这个误差往往是对模型真实误差的乐观估计。 原因在于,模型是建立在已有样本上的,它必将最大限度地反映已有样本的“核心行为",这是模型建立和参数估计的重要原则。但由于样本抽样的随机性,模型在已有样本上有优秀表现,并不意味着在其他样本或未来样本上仍然表现良好。因此,样本误差较真实误差偏低。

机器学习一般的数据集会划分为两个部分:

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效 划分比例:
  • 训练集:70% 80% 75%
  • 测试集:30% 20% 25%

数据集划分api

sklearn.model_selection.train_test_split(arrays, *options) 参数:

  • x 数据集的特征值

  • y 数据集的标签值

  • test_size 测试集的大小,如果是float,则应介于0.0和1.0之间,并表示要包含在测试拆分中的数据集的比例。默认0.25

  • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。

  • stratify是为了保持split前类的分布,例如训练集和测试集数量的比例是 A:B= 4:1,等同于split前的比例(80:20)。通常在这种类分布不平衡的情况下会用到stratify。

  • return

  • x_train, x_test, y_train, y_test

  • 比如有100个数据,80个属于A类,20个属于B类。如果train_test_split(... test_size=0.25, stratify = y_all), 那么split之后数据如下:

  • training: 75个数据,其中60个属于A类,15个属于B类。

  • testing: 25个数据,其中20个属于A类,5个属于B类。

 特征预处理定义

scikit-learn的解释 provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

1. 归一化

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

 作用于每一列,max为一列的最大值,min为一列的最小值,那么X’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0 那么怎么理解这个过程呢?

[mi,mx] 为转换的区间

我们通过一个例子 

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

MinMaxScalar.fit_transform(X)

  • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array
#work/data/dating.txt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
    """
    归一化演示
    :return: None
    """
    data = pd.read_csv("work/data/dating.txt")
    print(data)
    # 1、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=(2, 3))
    # 2、调用fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("最小值最大值归一化处理的结果:\n", data)
minmax_demo()

2. 标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内 

 作用于每一列,mean为平均值,σ为标准差

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

  • sklearn.preprocessing.StandardScaler( ) ** 处理之后每列来说所有数据都聚集在均值0附近标准差差为1

  • StandardScaler.fit_transform(X) ** X:numpy array格式的数据[n_samples,n_features]

  • 返回值:转换后的形状相同的array

import pandas as pd
from sklearn.preprocessing import StandardScaler    
def stand_demo():
    """
    标准化演示
    :return: None
    """
    data = pd.read_csv("work/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_)
stand_demo()

K-近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)

  • n_neighbors: ** int,可选(默认= 5),k_neighbors查询默认使用的邻居数

  • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}

  • 快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法

  • ball_tree、kd_tree、brute方法进行搜索,

  • brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。

  • kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。

  • ball tree是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。

#导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
#先从sklearn当中获取数据集,然后进行数据集的分割
# 1.获取数据集
iris = load_iris()
# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
#进行数据标准化
#特征值的标准化
# 3、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#模型进行训练预测
# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
 # 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("30个测试样本预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

import os
current_path = os.getcwd()  #获取当前路径
print(current_path)
filename= current_path+'//save//estimator.pkl' #在当前路径创建名为estimator.pkl

if not os.path.exists(filename):
    os.system(r"touch {}".format(path))#调用系统命令行来创建文件
#使用 joblib 保存
from sklearn.externals import joblib #jbolib模块 
#保存Model(注:save文件夹要预先建立,否则会报错)
joblib.dump(estimator,'save/estimator.pkl') 
#读取Model
estimator1= joblib.load('save/estimator.pkl') 
#测试读取后的Model
y_predict1 = estimator1.predict(x_test)
print("原模型预测结果为:\n", y_predict)
print("加载的模型预测结果为:\n", y_predict1)

交叉验证,网格搜索(模型选择与调优)API:

Python机器学习:Grid SearchCV(网格搜索)_gridsearchcv_元神の助手的博客-CSDN博客

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

  • 对估计器的指定参数值进行详尽搜索
  • estimator:估计器对象
  • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
  • cv:指定几折交叉验证 默认None,使用三折交叉验证
  • scoring:准确度评价标准

结果分析:

  • best_score__:在交叉验证中验证的最好结果_
  • best_estimator_:最好的参数模型
  • cv_results_:每次交叉验证后的验证集准确率结果和训练集准确率结果

鸢尾花案例增加K值调优

使用GridSearchCV构建估计器

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
# 1、获取数据集
iris = load_iris()

# 2、数据基本处理 -- 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("测试集的样本数:\n",y_test.shape)
# 3、特征工程:标准化
# 实例化一个转换器类
transfer = StandardScaler()
# 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4、KNN预估器流程

#  4.1 实例化预估器类
estimator01 = KNeighborsClassifier()
# 4.2 模型选择与调优——网格搜索和交叉验证
# 准备要调的超参数
param_dict = {"n_neighbors": [1,2,3,4,5]}
estimator02 = GridSearchCV(estimator01, param_grid=param_dict, cv=3)

# 4.3 fit数据进行训练
estimator02.fit(x_train, y_train)
# 5、评估模型效果
# 方法a:比对预测结果和真实值
y_predict = estimator02.predict(x_test)

print("比对预测结果和真实值:\n", y_predict == y_test)
# 方法b:直接计算准确率
score = estimator02.score(x_test, y_test)
print("直接计算准确率:\n", score)
#然后进行评估查看最终选择的结果和交叉验证的结果
print("在交叉验证中验证的最好结果:\n", estimator02.best_score_)
print("最好的参数模型:\n", estimator02.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator02.cv_results_)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值