sklearn学习笔记(5)——机器学习算法分类、K-近邻算法

机器学习算法分类

监督学习(预测):可以有输入数据中学到或建立一个模型,并以此模型推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。

分类:K-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络

回归:线性回归、岭回归

标注:隐马尔可夫模型

无监督学习:可以有输入数据中学到或建立一个模型,并以此模型推测新的结果。输入数据是有输入特征值所组成。

聚类:k-means

 

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

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

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

K值的大小有什么影响:1、K值取很小,容易受异常数据的影响;2、K值取很大,容易受样本数量的不平衡影响

性能问题:距离计算上面,时间复杂度高

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

优点:简单,易于理解,易于实现,无需估计参数,无需训练

缺点:懒惰算法,对测试样本分类时的计算量大,内存消耗大;必须指定K值,K值选择不当则分类精确度不能保证

sklearn K-近邻算法API:sklearn.neighbors.KNeighborsClassifier

模型的选择与调优

交叉验证

交叉验证是为了让被评估的模型更加准确可信

交叉验证过程:将拿到的训练数据,分为训练和验证集。以下图为例,将数据分成5份,其中一份作为验证集。经过5次(组)测试,每次都更换不同的验证集,得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证结果。

                   

超参数搜索--网格搜索

通常情况下,有很多参数都是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预测几种超参数组合。每组超参数都采用交叉验证来进行评估,最后选择最优参数组合建立模型。

sklearn超参数搜索--网格搜索API:sklearn.model_selection.GridSearchCV

 

数据资源链接:https://pan.baidu.com/s/18pgecHglwITFz98DQeVo1A  密码:8sqk

# -*- coding: utf-8 -*-

import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


def kneighborsClassifier():
    """
    K-近邻算法预测用户入住位置
    :return: None
    """

    """pandas"""
    # 读取数据
    data = pd.read_csv("./FBlocation/train.csv")

    # 缩小数据集,节约运算时间,正式运行可以不用缩小数据集
    data = data.query("x<1.25 & x>1.0 & y>2.5 & y<2.75")
    # print(data.head(10))

    # 处理时间戳特征数据,单独构造一些特征
    time_value = pd.to_datetime(data["time"])
    # print(time_value)

    # 构造一些新的特征  首先转换成字典格式,然后填充特征
    time_value = pd.DatetimeIndex(time_value)
    data["day"] = time_value.day
    data["weekday"] = time_value.weekday
    data["hour"] = time_value.hour
    # print(data.head(10))
    # 删除时间特征
    data = data.drop("time", axis=1)
    # print(data.head(10))

    # 筛选入住位置  人数少于n个人的不要
    place_count = data.groupby("place_id").count()

    # 重新设置索引,把place_id这个列索引单独当作一列
    tf = place_count[place_count.row_id > 3].reset_index()
    data = data[data["place_id"].isin(tf.place_id)]
    # print(data)

    y = data["place_id"]
    x = data.drop("place_id", axis=1)

    """sklearn"""
    # 分割数据集到训练集和测试集
    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)

    # 使用etimators去进行训练估计
    # knn = KNeighborsClassifier(n_neighbors=5)
    # # 输入数据
    # knn.fit(x_train, y_train)
    # # 预测测试集的样本的类别,和准确率
    # y_predict = knn.predict(x_test)
    # print("K-紧邻算法预测测试集这些样本入住位置:", y_predict)
    # print("预测的准确率:", knn.score(x_test, y_test))

    """网格搜索调参数"""
    knn = KNeighborsClassifier()
    param = {"n_neighbors": [3, 5, 10]}
    gc = GridSearchCV(knn, param_grid=param, cv=3)

    # 在这个fit操作,已经进行过了3折交叉验证
    gc.fit(x_train, y_train)
    print("准确率:", gc.score(x_test, y_test))

    # 打印交叉验证结果
    print("在交叉验证中最好的验证结果:", gc.best_score_)
    print("选择最好的K值为:", gc.best_estimator_)
    print("每次交叉验证的结果:", gc.cv_results_)


if __name__ == "__main__":
    kneighborsClassifier()

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卞亚超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值