机器学习算法基础——数据集操作、K-近邻算法

机器学习算法基础——数据集操作、K-近邻算法

sklearn数据集

数据集基本操作

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

2.scikit-learn数据集API介绍
类:sklearn.datasets

sklearn.datasets
  加载获取流行数据集
●datasets.load_()
  获取小规模数据集,数据包含在datasets里
●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.datasets.load_iris()——加载并返回鸢尾花数据集
sklearn.datasets.load_digits()——加载并返回数字数据集
【Sklearn 分类数据集——鸢尾花数据集】

from sklearn.datasets import load_iris
li = load_iris()
print('获取特征值')
print(li.data)
print('获取目标值')
print(li.target)
**********************************************
获取特征值
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
....]
获取目标值
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...]

3.数据集分割

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

【数据集的分割】

from sklearn.model_selection import train_test_split
li = load_iris()
#注意返回值、训练集:train,x_train特征值,y_train目标值,测试集:test,x_test,y_test
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)

【用于分类的大数据集】
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) #新闻数据集
●subset: ‘train’或者’test’,‘all’,可选,选择要加载的数据集,训练集的“训练”,测试集的“测试”,两者的“全部”
●datasets.clear_data_home(data_home=None)
  清除目录下的数据

【用于分类的大数据集——新闻数据集】

from sklearn.datasets import fetch_20newsgroups
news = fetch_20newgroups(subset='all')
print(news.data)
print(news.target)

【Sklearn 回归数据集——波士顿房价数据集】

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

转换器与估计器

1.转换器

fit_transform() 输入数据直接转换
fit() 输入数据,计算平均值、方差等
transform() 进行数据的转换,使用的是上面 fit() 计算出的均值、方差
fit_transform()=fit()+transform().
数据转换最好一次性完成

(1)实例化 (实例化的是一个转换器类(Transformer))
(2)调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)

2.估计器
在sklearn中,估计器(estimator)是一个重要的角色,分类器和回归器都属于estimator,是一类实现了算法的API。

(1)用于分类的估计器:
●sklearn.neighbors k-近邻算法
●sklearn.naive_bayes 贝叶斯
●sklearn.linear_model.LogisticRegress 逻辑回归
(2)用于回归的估计器:
●sklearn.linear_model.LinearRegression 线性回归
●sklearn.linear_model.Ridge 岭回归

【估计器的工作流程】
在这里插入图片描述

分类算法-k近邻算法(KNN)

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

来源:KNN算法最早是由Cover和Hart提出的一种分类算法。

【sklearn k-近邻算法API】

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
● n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
●algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

【案例实现】

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def knncls():
    #导入数据
    data = pd.read_csv('data.csv')
    #处理数据,缩小数据集
    data = data.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')
    
    #处理时间的数据
    time_value = pd.to_datetime(data['time'],unit='s')
    #把日期格式转换成字典格式,以便获取年、月、日特征
    time_value = pd.DatetimeIndex(time_value)
    #构造一些特征
    data['day'] = time_value.day
    data['hour'] = time_value.hour
    data['weekday'] = tiem_value.weekday
    #把时间戳特征删除
    data = data.drop(['time'],axis=1)  #sklearn删除列,axis=1
    
    ##将签到位置少于n个目标位置的删除
    #统计次数,此时以 place_id 为索引,row_id 里是出现的次数
    place_count =data.groupby('place_id').count()  
    #大于3的保留下来, place_id 转换为列,还原索引
    tf = place_count[place_count.row_id > 3].reset_index()
    #保留下所有大于3的数据
    data = data[data['place_id'].isin(tf.place_id)]

    #取出数据中的特征值和目标值
    y = data['place_id']
    x = data.drop(['palce_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)
    #直接调用 transform 就可以
    x_test = std.transform(x_test)
    
    #进行算法流程
    knn = KNeighborsClassifier(n_neighbors=5)
    #fit(输入数据),estimate(预测数据目标值),score(得出准确率)
    knn.fit(x_train,y_train)
    
    #得出预测结果
    y_predict = knn.predict(x_test)
    print('预测的目标签到位置为:',y_predict)
    #得出准确率
    print('预测的准确率:',knn.score(x_test,y_test))
    return None

if __name__ == '__main__':
    knncls()

(1)K—近邻算法问题:
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化

(2)K—近邻算法优缺点:
优点:简单,易于理解,易于实现,无需估计参数,无需训练。
缺点:
①懒惰算法,对测试样本分类时的计算量大,内存开销大。
②必须指定K值,K值选择不当则分类精度不能保证。

(3)使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值