机器学习_第二天(sklearn库+K近邻算法)

1、数据类型

  • 数据的类型是机器学习模型不同问题不同处理的依据
  • 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,且不能再细分,也不能进一步提高精确度。
  • 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类数通常是非整数,含有小数部分。

总结:离散型是区间内不可分,连续型是区间内可分。

2、机器学习算法分类

2.1 监督学习

输入数据有特征值和⽬标值,输出可以是连续的值(回归)或有限个离散值(分类),⽬标值用于和输出的预测值进行对比。

  • 分类:最基础的类问题是二分类,即判断是非。当输出变量取有限个离散值时,预测问题变成分类问题。
    k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
  • 回归:回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。
    线性回归、岭回归
  • 标注:隐马尔可夫模型 (不做要求)

2.2 无监督学习

输入数据有特征值无⽬标值。

  • 聚类:k-means

3、机器学习开发流程

在这里插入图片描述
1、从原始数据明确问题做什么,并根据(目标值)数据类型划分应⽤种类
2、数据的基本处理:pd处理数据(缺失值,合并表…)
3、特征⼯程 (特征进⾏处理)
4、找到合适算法去进⾏预测
5、模型的评估,判定效果
6、以API形式上线使⽤/换算法和调整参数

4、scikit-learn模块

4.1 scikit-learn数据集划分

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

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效,对于分类、回归、聚类,算法不同则评估标准不同。

常用划分比例:70%+30%,80%+20%,75%+25%(最优经验值)
sklearn数据集划分API:sklearn.model_selection

sklearn.model_selection.train_test_split(x, y,test_size=)
随机乱序抽取训练集和测试集

  • x:数据集的特征值
  • y:数据集的标签值
  • test_size:测试集的占比,一般为float
  • random_state:随机数种子,不同的种子会造成不同的随机采样结果,相同的种子采样结果相同。

注意:返回值顺序为【训练集特征值–测试集特征值–训练集目标值–测试集目标集】

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris=load_iris()
# 注意返回值,此时返回数据包括训练集和测试集,两者都有特征值和目标值
# 训练集train,训练集的特征值x_train,训练集的目标值y_train;测试集test,测试集的特征值x_test,训练集的目标值y_test
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.25)  #  变量承接数据不能错
# 参数一:数据集的特征值;参数二:数据值的目标值;参数三:测试集占总数据比例
print("训练集特征值与目标值",x_train,y_train)
print("测试集特征值与目标值",x_test,y_test)

4.2 scikit-learn获取数据集

scikit-learn数据集API:sklearn.datasets

加载获取数据集:

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

获取数据集返回的类型:
load_*和fetch_*返回的数据类型为datasets.base.Bunch(字典格式)

  • .data:特征数据数组,是二维的numpy.ndarray数组
  • .target:目标数据数组,是一维的numpy.ndarray数组
  • .DESCR:数据描述
  • .feature_names:特征名,新闻数据、手写数字、回归数据集没有
  • .target_names:目标名,回归数据集没有
4.2.1 分类数据集

datasets.load_*()

sklearn.datasets.load_iris():加载并返回鸢尾花数据集

# 目标值为离散值
from sklearn.datasets import load_iris

iris=load_iris()
print(iris.data)  # 返回特征数据数组
print(iris.target)  # 返回目标数据数组
print(iris.DESCR)  # 数据描述
print(iris.feature_names)  # 特征名
print(iris.target_names)  # 目标名

datasets.fetch_*(data_home=None)

sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’): 新闻数据集,划分为20个类别

  • subset:可选, 'train’训练集、'test’测试集、'all’全部,选择要加载的数据集.

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

from sklearn.datasets import fetch_20newsgroups

new = fetch_20newsgroups(subset='all')  # 载入全部数据,后续再数据集划分
print(new.data)
print(new.target)
4.2.2 回归数据集

回归数据集无.feature_names
datasets.load_*()

sklearn.datasets.load_boston():加载并返回波士顿房价数据集

from sklearn.datasets import load_boston

boston=load_boston()
print(boston.data)  # 返回特征数据数组
print(boston.target)  # 返回目标数据数组
print(boston.DESCR)  # 数据描述
print(boston.feature_names)  # 特征名

5、装换器与估计器

5.1 转换器

转换器是一类实现了特征工程的API

  • .fit_transform():输入数据直接转换
  • .fit():输入数据,并计算数据的均值与标准差
  • .transform():以上一次.fit()计算得出的值对数据进行转换
    注意:.fit_transform() ≈ .fit() + .transform(),但.transform()可能调用的不是当前传入数组的平均值与标准差,即.fit()和.transform()不一定匹配
from sklearn.preprocessing import StandardScaler

# .fit_transform效果等于.fit+.transform
s = StandardScaler()
f_t = s.fit_transform([[1, 2, 3], [4, 5, 6]])
print(f_t)
ss = StandardScaler()
f = ss.fit([[1, 2, 3], [4, 5, 6]])  # 计算所给数组的平均值与标准差
print(f)
t = ss.transform([[1, 2, 3], [4, 5, 6]])  # 对所给数据调用最近一次.fit函数计算的数组平均值与标准差
print(t)
f1 = ss.fit([[2, 3, 4], [4, 5, 6]])
t1 = ss.transform([[1, 2, 3], [4, 5, 6]])  # 注意:transform可能调用的不是当前传入数组的平均值与标准差
print(t1)

5.2 估计器

估计器(estimator)是一类实现了算法的API,分类器和回归器都属于estimator。

5.2.1 用于分类的估计器
  • sklearn.neighbors:k-近邻算法
  • sklearn.naive_bayes:贝叶斯
  • sklearn.linear_model.LogisticRegression:逻辑回归
5.2.2 用于回归的估计器
  • sklearn.linear_model.LinearRegression:线性回归
  • sklearn.linear_model.Ridge:岭回归
5.2.3 估计器的工作流程
  1. 调用fit输入训练集数据,建立模型
  2. 输入测试集数据,检验模型
  3. 输出预测结果
    方法一:score(x_test, y_test)
    方法二:y_predict = predict(x_test)
    在这里插入图片描述

6、分类算法之K近邻算法

如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。即k近邻算法(KNN)核心是通过相邻对象判断自身类型。

6.1 计算距离公式

两个样本的即特征空间距离可以通过如下公式计算(牢记),又叫欧式距离
e.g a(a1,a2,a3),b(b1,b2,b3)
在这里插入图片描述
K近邻算法为避免个别特征对结果影响太大,数据要进行标准化!

6.2 sklearn K-近邻算法API

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

参数:

  • n_neighbors:int(默认= 5),k_neighbors查询默认使用的邻居数为5
  • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}:选择实现算法时使用的数据结构,从而提高运行效率。'ball_tree’使用 BallTree;‘kd_tree’使用 KDTree;‘auto’根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

方法:

  • fit(x,y):从训练数据集中拟合K近邻分类器
  • predict(x):预测所提供数据的目标值
  • score(x,y [,sample_weight]):返回给定测试数据和标签上的准确度
6.2.1 K近邻算法实例:预测入住位置

数据说明-- train.csv,test.csv

  • row_id:签到事件的ID
  • xy:坐标
  • 精度:位置精度
  • 时间:时间戳
  • place_id:商家的ID,这是要预测的目标

数据的处理

  1. 缩小数据集范围
    原始数据是一个位于10平方公里内的多个位置点,为节省运行时间,可以缩小x,y取值范围
      DataFrame.query(‘查询条件’)
  2. 处理日期数据
    原始数据的时间字段是时间戳格式,转化成yyyy-mm-dd hh:mm:ss 的时间格式;
    并提取年、月、周、日、时、分、秒作为新特征,删除原有时间戳格式
      pd.to_datetime(列, unit=‘最小单位’):将时间戳改成yyyy-mm-dd格式
      pd.DatetimeIndex
      pd.drop([‘字段’],axis=1):删除指定字段
  3. 进一步缩小数据集范围
    分类太多的情况下预测可能出现偏差,删除签到用户少于n个的位置
      place_count =data.groupby(‘place_id’).count(),分组计数
    在这里插入图片描述
      place_nid = place_count[place_count[‘row_id’] > 3].index,保留签到用户>3人的位置
      data = data[data[‘place_id’].isin(place_nid)],保留满足条件的place_id数据
  4. 切片特征值与目标值并完成数据分割
    sklearn.model_selection.train_test_split(x,y,test_size=0.25)
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd

def knn():
    '''
    k近邻算法:预测用户签到位置
    :return: None
    '''
    # 1. 读取数据
    data = pd.read_csv(r"F:\working\pycharm_project\machine_learn\data\02.facebook-v-predicting-check-ins\train.csv")
    print(data.head(10))

    # 2. 处理数据
    # 2.1 缩小数据,缩小x、y范围
    data = data.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')  # 查询数据筛选
    # 2.2 处理时间戳
    time_value = pd.to_datetime(data['time'], unit='s')  # 切出时间戳数据作为输入列,指定最小单位秒
    print(time_value)
    # 2.3 构造有用的新特征
    # 2.3.1 把日期格式转换成字典格式
    time_key = pd.DatetimeIndex(time_value)
    # 2.3.2 对新列赋值
    data['day'] = time_key.day
    data['hour'] = time_key.hour
    data['weekday'] = time_key.weekday
    # 2.3.3 对已处理的原时间戳数据进行删除
    data = data.drop(['time'], axis=1)  # pandas中1为列
    print(data)
    # 2.3.4 分组统计求和,删除签到人数小于n个的place_id
    place_count = data.groupby('place_id').count()  # 以place_id分组,返回以'place_id'为索引,其余列count计数的dataframe
    print(place_count)
    place_nid = place_count[place_count['row_id'] > 3].index
    print(place_nid)
    data = data[data['place_id'].isin(place_nid)]
    print(data)
    # 2.3.5 取出数据中的特征值与目标值
    y = data['place_id']
    x = data.drop(['place_id', 'row_id'], axis=1)
    # 2.3.6 进行数据的分割(训练集+测试集)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

    # 3. 特征工程(标准化):测试集与训练集的特征值都需要做标准化
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 4. 进行算法流程
    knn = KNeighborsClassifier(n_neighbors=5)
    # 4.1 输入数据计算 fit
    knn.fit(x_train, y_train)
    # 4.2 得出分类预测结果
    # 4.2.1 输入测试集,得出预测值 predict
    y_predict = knn.predict(x_test)
    print('预测签到点为:', y_predict)
    # 4.2.2 得出准确率 score
    print('算法预测准确率:', knn.score(x_test, y_test))
    return None

if __name__ == '__main__':
    knn()
6.2.2 练习生物物种进行分类——鸢尾花(load_iris)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

def homework():
    '''
    用k近邻算法,分类鸢尾花
    :return:None
    '''
    # 获取数据
    iris = load_iris()
    # 取出特征值与目标值
    x = iris.data
    y = iris.target
    # 进行数据的分割
    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)
    knn.fit(x_train, y_train)  # 输入训练集,进行计算
    # 得出预测结果
    y_predict = knn.predict(x_test)
    print('测试集的预测值:', y_predict)
    print('k近邻预测准确率:', knn.score(x_test, y_test))
    return None

if __name__ == '__main__':
    homework()
6.2.3 k近邻总结

优点:

  • 简单,易于理解和实现
  • 无需估计参数(算法实例化时的参数是超参数,可以通过调整超参数提高准确率)
  • 无需训练(不需要计算迭代来提高准确率)

缺点:

  • 懒惰算法,每一个样本都需要和所有已有记录计算距离,对测试样本分类时的计算量大、时间复杂度高、内存开销大
  • 必须指定K值,K值的取值大小影响整个算法的预测精度,K值取很小容易受异常点影响,K值取很大容易受最近数据太多导致分类比例变化的影响

使用场景:
实际生活基本不用,因为其性能问题只适用于小数据场景(几千~几万样本)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值