机器学习系列---数据的划分&&转换器与估计器&& K-近邻算法及举例

数据集划分

  机器学习一般的数据集会划分为两个部分:
  **训练数据:**用于训练,构建模型
  **测试数据:**在模型检验时使用,用于评估模型是否有效

API

  sklearn.model_selection.train_test_split

sklearn数据集API介绍

  sklearn.datasets

  加载获取流行数据集

  1. datasets.load_*()
    获取小规模数据集,数据包含在datasets里;

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

返回类型

  • load和fetch返回的数据类型datasets.base.Bunch(字典格式)
  • data:特征数据数组,是 [n_samples * n_features] 的二维numpy.ndarray 数组
  • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
  • DESCR:数据描述
  • feature_names:特征名。(新闻数据,手写数字、回归数据集没有)
  • target_names:标签名。(回归数据集没有)
 

sklearn分类数据集举例

sklearn.datasets.load_iris() :加载并返回鸢尾花数据集
(这是自带的一个函数,包括了数据集)

from sklearn.datasets import load_iris
li = load_iris() #实例化API
print("获取特征值")
print(li.data)
print("目标值")
print(li.target)
print(li.DESCR)

  这个数据集共有150组,每行是一组数据,一组里有四个值(四列),每一个值代表相应的特征,目标值分为0,1,2(比如0,1,2分别代表鸢尾花中的三个不同类型)
 
在这里插入图片描述
在这里插入图片描述
 
  Attribute Information : 四个特征的属性含义
在这里插入图片描述
 

数据集分割

  sklearn.model_selection.train_test_split(*arrays, **options)
  x 数据集的特征值
  y 数据集的标签值
  test_size 测试集的大小(一般可以选20%-30%),一般为float
  random_state 随机数种子,不同的种子会造成不同的随机 采样结果。相同的种子采样结果相同。
  return 训练集特征值,测试集特征值,训练标签,测试标签 (默认随机取)
 

数据集分割举例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
li = load_iris() #实例化API
#print("获取特征值")
#print(li.data)
#print("目标值")
#print(li.target)
#print(li.DESCR)

# 注意返回值, 训练集train:x_train, y_train;测试集test:x_test,y_test。train_test_spli()的返回值严格按照特征值、目标值顺序来,所以是x_train, x_test, y_train, y_test;traintest_spli()默认是乱序的
x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)
print("训练集特征值和目标值:", x_train, y_train)
print("测试集特征值和目标值:", x_test, y_test)

在这里插入图片描述
  此处省略了大量特征值

在这里插入图片描述
在这里插入图片描述
  此处省略了大量特征值

在这里插入图片描述
  即这个函数把数据集按照3:1的比例分成了训练集(特征值和目标值)和测试集(特征值和目标值),并且是乱序的
 

用于分类的大数据集

sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) subset: ‘train’或者’test’,‘all’,可选,选择要加载的数据集. 训练集的“训练”,测试集的“测试”,两者的“全部”

datasets.clear_data_home(data_home=None) 清除目录下的数据

sklearn 回归数据集举例

from sklearn.datasets import load_boston
lb = load_boston()
print("获取特征值")
print(lb.data)
print("目标值")
print(lb.target)
print(lb.DESCR)

在这里插入图片描述
在这里插入图片描述
回归数据集特征:目标值是连续型数据
 

转换器与预估器

转换器:
  fit_transform() 和fit()、transform()效果是一样的
但是,fit()是通过计算对应列的方差、平均值等来确定转换的方式,然后再用transform()进行转化,所以fit([1,2,3],[4,5,6]),再transform([2,3,4],[5,6,7])的时候,应用的标准是fit([1,2,3],[4,5,6])的标准。
  一般直接fit_transform() 即可
在这里插入图片描述

估计器:
在这里插入图片描述
 

K-近邻算法

  定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

在这里插入图片描述
  这个未知电影名称的类别可以通过计算“距离”来获得
在这里插入图片描述
  距离公式如下,举个例子:根号((18-3)^ 2+(90-104)^ 2)=20.5
在这里插入图片描述
  相似的样本特征之间的值都是相近的

  对数据要先进行标准化处理,不然有很大的数据的话,其他数据的影响就被忽略了
 

sklearn k-近邻算法API

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

   n_neighbors:int,可选(默认= 5,就是k值),k_neighbors查询默认使用的邻居数
(k值对结果会有影响)

  algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

例子

在这里插入图片描述
在这里插入图片描述

  1. 由于数据量大,节省时间 缩小x,y

  2. 时间戳进行(年,月,日,周,时分秒),当做新的特征

  3. 几千~几万,少于指定签到人数的位置删除

from sklearn.neighbors import kNeighborsClassifier
import pandas as pd
def knncls():
"""
k近邻预测用户签到位置
"""
# 读取数据
	data = pd.read_csv("./data/------")
	print(data.head(10)) #打印前十行
	#输出 见图1
	
#处理数据
	#1.缩小数据,查询数据筛选
	data.query("x>1.0 & x<1.25 & y > 2.5 & y < 2.75")
	
	#2.处理时间数据(转换成年月日周时分秒)
	time_value = pd.to_datatime(data['time'],unit='s')
	print(time_value)
	#输出 见图2
	
	#把日期格式转换为 字典格式
	time_value = pd.DatatimeIndex(time_value)
	#构造一些特征
	data['day'] =  time_value.day
	data['hour'] =  time_value.hour
	data['weekday'] =  time_value.weekday
	#把时间戳特征删除
	data = data.drop(['time'],axis=1)    #pd里1表示列 
	print(data)
	#输出 见图3
	
	#把签到数量少于n个目标位置删除
	place_count = data.groupby('place_id').count() #以place_id分组,统计次数;place_count是索引(以某个东西分组的时候,前面就是指索引)
	tf = place_count[place_count,row_id>3].reset_index()
	data = data[data['place_id'].isin(tf.place_id)]
	#取出数据当中的特征值和目标值
	y = data['place_id']
	x = data.drop([place_id],axis=1)
	#进行数据的分割训练集合测试集
	x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
	
#特征工程(标准化)
	std = StandardScaler()
	#对测试集和训练集的特征值进行标准化
	x_train = std.fit_transform(x_train)
	x_test = std.transform(x_test)
	
#进行算法流程
	knn = kNeighborsClassifier(n_neighbors=5)
	
	#fit,predict,score
	knn.fit(x_train,y_train)

#得出预测结果
	y_predict = knn.predict(x_test)
	print("预测的目标签到位置为:",y_predict)
	#得出准确率
	print("预测的准确率:",knn.score(x_test,y_test))
	#输出 见图4
	


if __name__ == "__main__":
	knncls()

图1
在这里插入图片描述
图2
在这里插入图片描述
图3
在这里插入图片描述
图4
在这里插入图片描述
 

总结(KNN优缺点)

  缺点: k值取很小的时候,容易受异常点影响;k值取很大的时候,容易受 K值数量波动;性能上,时间复杂度很高。懒惰算法,对测试样本分类时的计算量大,内存开销大 必须指定K值,K值选择不当则分类精度不能保证

  优点: 简单,易于理解,易于实现,无需估计参数(是指算法里面的参数,比如求距离的时候),无需训练(不需要迭代,距离一次就算完了)

  **使用场景:**小数据场景,几千~几万样本,具体场景去测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值