机器学习基础——数据集与估计器、k近邻算法

1sklearn数据集与估计器

2、分类算法-k近邻算法

3k-近邻算法实例

4、分类模型的评估

5、分类算法-朴素贝叶斯算法

6、朴素贝叶斯算法实例

7、模型的选择与调优

8、决策树与随机森林

1sklearn数据集与估计器

数据集的划分

数据的训练模型和评估模型不能用同一个数据集,所以要把数据划成两部分:

 75%:25%是经验后比较好的数据集的划分

训练集用来建立模型;测试集用来评估模型。不同的算法评估的模型方法会不一样。

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

训练数据:用于训练,构建模型

测试数据:在模型检验时使用,用于评估模型是否有效

sklearn数据集划分API

 sklearn.model_selection.train_test_split

 

scikit-learn数据集API介绍

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 :标签名 , 回归数据集没有

 

 

from sklearn.datasets import load_iris

li = load_iris()
print("获取特征值")
print(li.data)
print("目标值")
print(li.target)
print(li.DESCR)

sklearn.datasets里面有各种比较小的数据包

结果:

 

(1)

data:特征数据数组,是 [n_samples * n_features] 的二维numpy.ndarray 数组

 •target:标签数组,是 n_samples 一维 numpy.ndarray 数组

 (3)DESCR:数据描述

 分别是特征名和标签名

数据集进行分割

from sklearn.model_selection import train_test_split

#注意返回值, 训练集 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)

(1)从sklearn的模型选择库里面取分割的方法

(2)返回值有4种,按顺序分别是训练集特征值和目标值,测试集特征值和目标值

(3)test_size参数为测试集的占比,根据经验0.25为最优

用于分类的大数据集

sklearn.datasets.fetch_20newsgroups ( data_home = None,subset =‘train’ )
subset: 'train' 或者 ' test','all ' ,可选,选择要加载的数据集 .

训练集的“训练”,测试集的“测试”,两者的“全部”

from sklearn.datasets import  fetch_20newsgroups
news = fetch_20newsgroups(subset='all')

print(news.data)
print(news.target)

一般选择all,下载完后再train_test_split

结果:

 

回归数据集

操作方法也同分类的特征值和目标值,只是其为连续型数据

 

from sklearn.datasets import load_iris, fetch_20newsgroups, load_boston

lb = load_boston()

print("获取特征值")
print(lb.data)
print("目标值")
print(lb.target)
print(lb.DESCR)

结果:

描述特征:

 

 

1.2估计器

转换器实现了特征工程:

 fit_transform():输入数据,直接转换,等于fit()+transform()

fit():输入数据,但不做事情(但计算平均值、方差等)

transform():进行数据的转换

 fit_transform()一般使用就使用这个。

而估计器实现了算法:

sklearn机器学习算法的实现-估计器

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

1、用于分类的估计器:

sklearn.neighbors  k- 近邻算法
sklearn.naive_bayes      贝叶斯
sklearn.linear_model.LogisticRegression     逻辑回归

2、用于回归的估计器:

sklearn.linear_model.LinearRegression     线性回归
sklearn.linear_model.Ridge      岭回归

3.聚类 

每个算法API当中的参数,需要掌握,也是机器学习的门槛。

 

 第一步:调用fit(x_train,y_train),训练集和测试集中的特征值

第二步:输入训练集和测试集中的目标值

第三步:估计器估计

第四步:预测y_predict

第五步:检验模型的精度,score(x_test,y_test)

具体算法阶段:

2、分类算法-k近邻算法

离散型数据

K近邻算法:哪个邻居离你最近,你就是哪里

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

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

来源:KNN算法最早是由CoverHart提出的一种分类算法

 

 欧式距离

 

相似的样本,特征之间的值应该都是相近的。

K近邻算法是需要进行标准化处理的,否则某一维度数据过大,影响最后的结果

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 方法的值来决定最合适的算法。 ( 不同实现方式影响效率 )——不用管,由系统自定。

 

分类问题

特征值:x,y坐标,定位准确性,时间戳

目标值:入住位置的ID

处理:

1.由于数据太大,便于处理,要进行数据缩小,节省时间

0<x<10,0<y<10 

2.时间戳进行(年,月,日,周,时分秒)处理,当做新的特征。(看情况,不一定需要处理)

于是特征值:x,y坐标,定位准确性,日,时,周当做新特征。——是否合适,还需要看最后检验。

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

1、缩小数据集范围

DataFrame.query()

2、处理日期数据

pd.to_datetime

pd.DatetimeIndex

3、增加分割的日期数据

4、删除没用的日期数据

pd.drop

5、将签到位置少于n个用户的删除

place_count =data.groupby('place_id').aggregate(np.count_nonzero)

分组后得到的结果类似如下,对哪一个字段进行分组,哪一个字段就成为id

这id不在数据数组中,不能猎取,故得使用下一步方法:
tf = place_count[place_count.row_id > 3].reset_index()

结果类似如下图,以data数据为基础,新建了一个tf对象,reset_index()相当于是把原来的aisle_id提取出来作为数组,并重新编号id

 

根据筛选之后的id,只取data中适合的部分

data = data[data['place_id'].isin(tf.place_id)]

结果类似如下:

 

训练集和测试集的特征值需要标准化,目标值不用

def knncls():
    """
    K-近邻预测用户签到位置
    :return:None
    """
    # 读取数据
    data = pd.read_csv("./data/FBlocation/train.csv")

    # print(data.head(10))

    # 处理数据
    # 1、缩小数据,查询数据筛选
    #用query()的方法进行,()内是引号,条件并列用&连接起来
    data = data.query("x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75")

    # 处理时间的数据,变成常见的时间格式,原来的数据是整数形式,记录的是1970.01.01.00起的以秒计数的整数
    #to_datetime()进行转换
    #生成了一列同data一样顺序的time_value表
    time_value = pd.to_datetime(data['time'], unit='s')

    print(time_value)

    # 把日期格式转换成 字典格式
    time_value = pd.DatetimeIndex(time_value)

    # 构造一些特征
    #data新增加列
    data['day'] = time_value.day
    data['hour'] = time_value.hour
    data['weekday'] = time_value.weekday

    # 把时间戳特征删除
    data = data.drop(['time'], axis=1)

    print(data)

    # 把签到数量少于n个目标位置删除(参见代码段外的解释)
    place_count = data.groupby('place_id').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实例
    std = StandardScaler()

    # 对测试集和训练集的特征值进行标准化
    x_train = std.fit_transform(x_train)#对于std实例,一步到位输入与转换

    #std实例中,已经有了x_train的平均值和标准差,所以,不用再fit()或者fit_transform(),否则标准又变了。
    x_test = std.transform(x_test)

    # 进行算法流程 # 超参数
    #需要对n_nerghbors参数调整,调参
    knn = KNeighborsClassifier()

    # # 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))

    # 构造一些参数的值进行搜索
    param = {"n_neighbors": [3, 5, 10]}

    # 进行网格搜索
    gc = GridSearchCV(knn, param_grid=param, cv=2)

    gc.fit(x_train, y_train)

    # 预测准确率
    print("在测试集上准确率:", gc.score(x_test, y_test))

    print("在交叉验证当中最好的结果:", gc.best_score_)

    print("选择最好的模型是:", gc.best_estimator_)

    print("每个超参数每次交叉验证的结果:", gc.cv_results_)

    return None

KNN算法总结:

  1k值取多大?有什么影响?

k值取很小:容易受异常点影响

k值取很大:容易受最近数据太多导致比例变化

2、性能问题

需要N个样本计算距离

需要调参:n_nerghbors,设置不同的值

优点:
简单,易于理解,易于实现, 无需估计参数,无需训练(超参数不是估计参数;无需训练,只不需要迭代)
缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定 K 值, K 值选择不当则分类精度不能保证
使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试(也即使用场景较少,主要是内存开销大,需要指定K值,精度不能保证)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值