机器学习.

目录

一.机器学习概述

1.1人工智能概述

1.2什么是机器学习

1.2.1定义

1.2.2解释

1.2.3数据集的构成

 1.3机器学习算法分类

1.3.1总结

1.3.2机器学习算法分类

1.4机器学习开发流程

 1.5学习框架和资料介绍

二、特征工程

2.1数据集

 2.1.1Scikit-learn工具介绍

 2.1.2安装

2.1.3sklearn数据集

2.1.4数据集的划分

2.1.5代码测试

2.2特征工程介绍

2.2.1什么是特征工程

2.2.3特征工程包含内容

2.3特征提取

2.3.1特征提取

 2.3.2字典特征提取

2.3.3文本特征提取

2.3.4对中文进行特征值化

2.3.5Tf-idf文本特征提取(该如何处理某个词或短语在多篇文章中出现的次数高这种情况:文章类型?)

2.4特征预处理

2.4.1包含内容

2.4.2特征与处理API

2.4.3归一化

 2.4.4归一化总结

2.4.5标准化

2.5特征降维

2.5.1降维简介

2.5.2什么是特征选择

2.5.3过滤式之方差选择法

2.5.4过滤式之方差系数

2.6主成分分析

2.6.1什么是主成分分析

2.6.2案例:探究用户对物品类别的喜好细分降维

3.分类算法

3.1 sklearn转换器和估计器

3.1.1转换器

3.1.2估计器(sklearn机器学习算法的实现)

 3.2K-近邻算法(KNN)

3.2.1定义

3.2.2案例1:鸢尾花种类预测

3.2.3K-近邻总结


一.机器学习概述

1.1人工智能概述

.机器学习和人工智能,深度学习

关系

  • 机器学习是人工智能的一个实现途径
  • 深度学习是机器学习的一个方法发展而来

机器学习,深度学习能做什么:传统预测,图像识别,自然语言处理

1.2什么是机器学习

1.2.1定义

机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测

1.2.2解释

我们从大量的日常经验中归纳规律,当面临新的问题的时候,就可以利用以往总结的规律去分析现实状况,采取最佳策略。

1.2.3数据集的构成

结构:特征值+目标值

对于每一行数据我们可以称之为样本

有些数据集可以没有目标值;(这个可用到特殊算法进行分类)

 1.3机器学习算法分类

1.3.1总结

监督学习

        目标值:类别-分类问题(猫狗识别,人脸识别)

        目标值:连续型数据-回归问题(房价预测,预测明天的气温是多少度)

无监督学习

        目标值:无

1.3.2机器学习算法分类

监督学习(预测)

  • 定义:输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)
  • 分类:k-近邻算法,贝叶斯分类,决策树和随机森林,逻辑回归
  • 回归:线性回归,岭回归

无监督学习

  • 定义:输入数据是由输入特征值所组成
  • 聚类k-means

1.4机器学习开发流程

  • 获取数据
  • 数据处理
  • 特征工程
  • 机器学习算法进行训练-模型
  • 模型评估

 1.5学习框架和资料介绍

需明确几点问题

  • 算法是核心,数据与计算是基础
  • 找准定位

二、特征工程

2.1数据集

目标:

  • 知道数据集的分为训练集和测试集
  • 会使用sklearn的数据集,数据量少方便学习(scikit-learn),其他的数据集kaggle,UCI

 2.1.1Scikit-learn工具介绍

  • python语言的机器学习工具
  • Scikit-learn包括许多知名的机器学习算法的实现
  • Scikit-learn文档完善,容易上手,丰富的API

 2.1.2安装

pip3 install sklearn

安装好之后通过以下命令查看是否安装成功

import sklearn

注意:安装scikit-learn需要Numpy,Scipy等库

2.1.3sklearn数据集

1.scikit-learn数据集API介绍

  • 加载获取流行数据
  • datasets.load_*():获取小规模数据集,数据包含在datasets里(*数据集的名字)
  • datasets.fetch_*(data_home=None):获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据下载的目录,默认是~/scikit_learn_data/

2.sklearn小数据集

  • sklearn.datasets.load_iris()加载返回鸢尾花数据集
  • sklearn.datasets.load_boston()加载返回波士顿房价数据集

3.sklearn大数据集

  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset="tran")
  1.   subset:train或者test,all可选,选择要加载的数据集
  2. 训练集的训练,测试集的测试,两者的全部

4.数据集的返回值

  • datasets.base.Bunch(继承自字典)
  1. dict["key"]=values
  2. bunch.key=values

5.sklearn数据集返回值介绍

  • data:特征数据数组,是【n_samples * n_features】的二维numpy.ndnarray数组
  • target:标签数组,是n_samples的一维numpy.ndarray数组

2.1.4数据集的划分

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

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

划分比例:

  •  训练集:70% 80% 75%
  • 测试集:30% 20% 30%       

数据集划分api

sklearn.model_selection.train_test_split(arrays,*options)

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

2.1.5代码测试

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_dome():
    iris=load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print(iris.data.shape)
    #数据计划分
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2)#(默认0.25之前是150现在是120)
    print("训练集的特征值:\n",x_train,x_train.shape)
    return None
if __name__=="__main__":
    datasets_dome()

2.2特征工程介绍

2.2.1什么是特征工程

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

意义:会直接影响机器学习的效果

2.2.3特征工程包含内容

  • 特征抽取
  • 特征预处理
  • 特征降维

2.3特征提取

机器学习算法-统计方法-数学公式

2.3.1特征提取

1.将任意数据(如文本或图像)转化为可用于机器学习的数字特征

注:特征值化是为了计算机更好的去理解数据

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习)

2.特征处理API

sklearn.feature_extraction

 2.3.2字典特征提取

作用:对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer(sparse=True...)

  • DictVectorizer.fit_transform(x) X:字典或者包含字典的迭代器返回值:返回sparse矩阵(稀疏矩阵将非零值按位置表示出来节省内存)
  • DictVectorizer.inverse_transform(x)X:array数组或者sparse矩阵 返回值:转换之前数据格式
  • DicVectorizer.get_feature_names()返回类别名称

vector 数学:向量 物理:。矢量

        矩阵 matrix 二维数组

        向量 vector 一维数组

        

from sklearn.feature_extraction import DictVectorizer
def dict_demo():
    data=[{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
    #1.实例化一个转换器类
    transfer=DictVectorizer(sparse=False)
    #2.调用fit_transform()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return  None
if __name__=="__main__":
    dict_demo()

sparse=False

data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

sparse=True

data_new:
   (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

2.3.3文本特征提取

对文本数据进行特征值化

CountVectorizer统计每个样本特征词出现的个数

from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
    data=["life is short,i like like python","life is too long"]
    #1.实例化一个转换器类
    transfer=CountVectorizer(stop_words=["is","too"])#添加停用词
    #2.调用fit_transform()
    data_new=transfer.fit_transform(data)
    print(type(data_new))
    print("data_new:\n",data_new.toarray())
    print("特征名字:\n",transfer.get_feature_names_out())
    return  None
if __name__=="__main__":
    count_demo()

<class 'scipy.sparse._csr.csr_matrix'>
data_new:
 [[1 1 2 0 1 1 0]
 [1 1 0 1 0 0 1]]
特征名字:
 ['is' 'life' 'like' 'long' 'python' 'short' 'too']

2.3.4对中文进行特征值化

pip3 install jieba
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cut_word(text):
   text=" ".join(list(jieba.cut(text)))
   return text
def count_chinese_demo():
    data=["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 1.实例化一个转换器类
    transfer = CountVectorizer()  # 添加停用词
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print(type(data_final))
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())
if __name__=="__main__":
    print(cut_word("我爱北京天安门"))
    count_chinese_demo()

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\admin\AppData\Local\Temp\jieba.cache
Loading model cost 0.416 seconds.
Prefix dict has been built successfully.
我 爱 北京 天安门
['今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
<class 'scipy.sparse._csr.csr_matrix'>
data_new:
 [[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
特征名字:
 ['一种' '不会' '不要' '之前' '了解' '事物' '今天' '光是在' '几百万年' '发出' '取决于' '只用' '后天' '含义'
 '大部分' '如何' '如果' '宇宙' '我们' '所以' '放弃' '方式' '明天' '星系' '晚上' '某样' '残酷' '每个'
 '看到' '真正' '秘密' '绝对' '美好' '联系' '过去' '这样']

2.3.5Tf-idf文本特征提取(该如何处理某个词或短语在多篇文章中出现的次数高这种情况:文章类型?)

  • 主要思想:一篇文章中出现的概率高,并且在其他文章中很少出现,适合分类
  • 评估一字词对于一个文件集等的重要程度
  • TF-词频
  • idf-逆向文档频率,是一个词语普遍重要性的度量,可以由总文件数目除以包含盖刺鱼之文件的数码,再将的到的商取以10为底的对数得到

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def tfidf_demo():
    def cut_word(text):
        text = " ".join(list(jieba.cut(text)))
        return text
    #用tfidf方法进行文本特征抽取
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
            ]
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 1.实例化一个转换器类
    transfer = TfidfVectorizer()  # 添加停用词
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print(type(data_final))
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())
if __name__=="__main__":
    tfidf_demo()

['今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
<class 'scipy.sparse._csr.csr_matrix'>
data_new:
 [[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]
特征名字:
 ['一种' '不会' '不要' '之前' '了解' '事物' '今天' '光是在' '几百万年' '发出' '取决于' '只用' '后天' '含义'
 '大部分' '如何' '如果' '宇宙' '我们' '所以' '放弃' '方式' '明天' '星系' '晚上' '某样' '残酷' '每个'
 '看到' '真正' '秘密' '绝对' '美好' '联系' '过去' '这样']

2.4特征预处理

通过转换函数将特征数据转换成更加适合算法模型的特征数据过程

2.4.1包含内容

  • 数值型数据的无量纲化
    • 归一化
    • 标准化

2.4.2特征与处理API

为什么要进行归一化/标准化?(两个样本对比,其中同一列相差太大影响最后结果权重比较大)

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响目标结果

2.4.3归一化

  1. 定义:通过对原始的数据进行变化,把数据映射到(默认【0,1】之间)
  2. 公式:x^{'}=\frac{x-min}{max-min},x^{''}=x^{'}*(mx-mi)+mi    max为每一列的最大值,那么x"为最终结果,mx,mi分别为指定区间值默认为mx为1,mi为0

数据

dating.txt

milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673984,2
26852,1.441871,8.805124,1
75136,13.147394,0.428964,1
38344,1.669788,8.134296,1
72993,18.141740,1.032955,1
35948,6.838792,1.213192,3
42666,13.276369,8.543888,3
67497,8.631577,8.749278,1
35483,12.273169,1.588853,3
56242,3.723498,8.831917,1
63275,8.385879,1.669485,1
5569,4.875435,8728658,2
51052,4.688098,8.625224,1
77372,15.29957,0.331351,1
43673,1.889461,0.191283,1
61364,7.516754,1.269164,1
69673,14.239195,8.261333,1
15669,15.880000,1.250185,2


import jieba
from sklearn.preprocessing import  MinMaxScaler
import pandas as pd
#归一化
#1.获取数据
def minmax_demo():
    data=pd.read_csv("dating.txt")

    data=data.iloc[:, :3]
    print("data:\n",data)
    #2.实例化一个转换器类
    transfer=MinMaxScaler(feature_range=(1,2))#范围
    #3.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new)
    return  None
if __name__=="__main__":
    minmax_demo()

j结果:


data:
     milage     Liters    Consumtime
0    40920   8.326976  9.539520e-01
1    14488   7.153469  1.673984e+00
2    26852   1.441871  8.805124e+00
3    75136  13.147394  4.289640e-01
4    38344   1.669788  8.134296e+00
5    72993  18.141740  1.032955e+00
6    35948   6.838792  1.213192e+00
7    42666  13.276369  8.543888e+00
8    67497   8.631577  8.749278e+00
9    35483  12.273169  1.588853e+00
10   56242   3.723498  8.831917e+00
11   63275   8.385879  1.669485e+00
12    5569   4.875435  8.728658e+06
13   51052   4.688098  8.625224e+00
14   77372  15.299570  3.313510e-01
15   43673   1.889461  1.912830e-01
16   61364   7.516754  1.269164e+00
17   69673  14.239195  8.261333e+00
18   15669  15.880000  1.250185e+00
data_new
 [[1.49233319 1.41228497 1.00000009]
 [1.12421487 1.34201454 1.00000017]
 [1.29640823 1.         1.00000099]
 [1.96885924 1.70093502 1.00000003]
 [1.45645725 1.01364783 1.00000091]
 [1.93901369 2.         1.0000001 ]
 [1.42308817 1.32317146 1.00000012]
 [1.51664972 1.70865813 1.00000096]
 [1.86247093 1.43052469 1.00000098]
 [1.41661212 1.64858581 1.00000016]
 [1.7057226  1.13662544 1.00000099]
 [1.80367116 1.41581212 1.00000017]
 [1.         1.20560425 2.        ]
 [1.6334415  1.19438638 1.00000097]
 [2.         1.82980884 1.00000002]
 [1.53067421 1.02680201 1.        ]
 [1.77705667 1.3637683  1.00000012]
 [1.89277607 1.76631284 1.00000092]
 [1.14066265 1.8645654  1.00000012]]

Process finished with exit code 0
 

如果数据中异常点较多,会有什么影响

异常值:最大值,最小值

 2.4.4归一化总结

这种方法鲁棒性较差,只适合传统精确小数据场景

2.4.5标准化

  1. 定义:通过对原始数据进行变化把数据换到均值为0,标准差为1范围内
  2. 公式:x'=\frac{x-mean}{\sigma }    作用于每一列,mean为平均值,\sigma为标准差

import jieba
from sklearn.preprocessing import  StandardScaler
import pandas as pd
#归一化
#1.获取数据
def stand_demo():
    data=pd.read_csv("dating.txt")

    data=data.iloc[:, :3]
    print("data:\n",data)
    #2.实例化一个转换器类
    transfer=StandardScaler()#范围
    #3.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new)
    return  None
if __name__=="__main__":
    stand_demo()

data_new
 [[-0.29126144 -0.09622819 -0.23570381]
 [-1.54429242 -0.32978468 -0.23570344]
 [-0.9581667  -1.46653186 -0.23569978]
 [ 1.33077655  0.86315246 -0.23570408]
 [-0.41337886 -1.42117082 -0.23570013]
 [ 1.22918585  1.85714902 -0.23570377]
 [-0.52696324 -0.39241307 -0.23570368]
 [-0.20849085  0.88882163 -0.23569992]
 [ 0.96864339 -0.03560517 -0.23569981]
 [-0.54900695  0.68916038 -0.23570348]
 [ 0.43509074 -1.01243249 -0.23569977]
 [ 0.76849596 -0.08450506 -0.23570344]
 [-1.96710504 -0.78316896  4.24264069]
 [ 0.18905446 -0.82045358 -0.23569987]
 [ 1.43677599  1.29148793 -0.23570413]
 [-0.16075318 -1.37745054 -0.2357042 ]
 [ 0.67790341 -0.25748211 -0.23570365]
 [ 1.07179848  1.08044746 -0.23570006]
 [-1.48830613  1.40700764 -0.2357

0366]]

2.5特征降维

2.5.1降维简介

降维是指在某些限定的条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

降低随机变量的个数

相关特征:

  • 相对湿度与降雨量之间的相关

特征与特征之间相关性很高:

  • 选取其中一个
  • 加权求和
  • 主成分分析

2.5.2什么是特征选择

  1. 定义:数据中包含冗余或相关变量,旨在从原有特征中找出主要特征
  2. 方法:
    1. filter过滤式
      1. 方差选择法:低方差特征过滤
      2. 相关系数 特征与特征之间的相关程度
    2. Embeded嵌入式
      1. 决策树
      2. 正则化
      3. 深度学习
  3. 模块:sklearn.feature_selection

2.5.3过滤式之方差选择法

特征方差小:某个特征大多样本的值比较相近

特征方差大:某个特征根多样本的值都有差别


import jieba
from sklearn.feature_selection import  VarianceThreshold
import pandas as pd
#归一化
#1.获取数据
def variance_demo():
    data=pd.read_csv("dating.txt")

    data=data.iloc[:, :3]
    print("data:\n",data)
    #2.实例化一个转换器类
    transfer=VarianceThreshold(threshold=100)#阈值

    #调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new,data_new.shape)
    return  None
if __name__=="__main__":
    variance_demo()

2.5.4过滤式之方差系数

皮尔逊相关系数:反应变量之间相关关系密切程度的统计指标

公式:r=\frac{n\sum xy-\sum x\sum y}{\sqrt{n\sum x^{2}-(\sum x)^{2}}\sqrt{n\sum y^{2}-(\sum y)^{2}}}


import jieba
from sklearn.feature_selection import  VarianceThreshold
from scipy.stats import  pearsonr
import pandas as pd
import matplotlib.pyplot as plt
#归一化
#1.获取数据
def variance_demo():
    data=pd.read_csv("dating.txt")

    data=data.iloc[:, :3]
    print("data:\n",data)
    #2.实例化一个转换器类
    transfer=VarianceThreshold(threshold=100)#阈值

    #调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new,data_new.shape)
    #计算两个变量之间的相关系数
    r=pearsonr(data["milage"],data["Liters"])
    print("相关系数:",r)
    plt.figure(figsize=(20,8),dpi=100)
    plt.scatter(data["milage"],data["Liters"])
    plt.show()
    return  None
if __name__=="__main__":
    variance_demo()

结果:


data:
     milage     Liters    Consumtime
0    40920   8.326976  9.539520e-01
1    14488   7.153469  1.673984e+00
2    26852   1.441871  8.805124e+00
3    75136  13.147394  4.289640e-01
4    38344   1.669788  8.134296e+00
5    72993  18.141740  1.032955e+00
6    35948   6.838792  1.213192e+00
7    42666  13.276369  8.543888e+00
8    67497   8.631577  8.749278e+00
9    35483  12.273169  1.588853e+00
10   56242   3.723498  8.831917e+00
11   63275   8.385879  1.669485e+00
12    5569   4.875435  8.728658e+06
13   51052   4.688098  8.625224e+00
14   77372  15.299570  3.313510e-01
15   43673   1.889461  1.912830e-01
16   61364   7.516754  1.269164e+00
17   69673  14.239195  8.261333e+00
18   15669  15.880000  1.250185e+00
data_new:
 [[4.092000e+04 9.539520e-01]
 [1.448800e+04 1.673984e+00]
 [2.685200e+04 8.805124e+00]
 [7.513600e+04 4.289640e-01]
 [3.834400e+04 8.134296e+00]
 [7.299300e+04 1.032955e+00]
 [3.594800e+04 1.213192e+00]
 [4.266600e+04 8.543888e+00]
 [6.749700e+04 8.749278e+00]
 [3.548300e+04 1.588853e+00]
 [5.624200e+04 8.831917e+00]
 [6.327500e+04 1.669485e+00]
 [5.569000e+03 8.728658e+06]
 [5.105200e+04 8.625224e+00]
 [7.737200e+04 3.313510e-01]
 [4.367300e+04 1.912830e-01]
 [6.136400e+04 1.269164e+00]
 [6.967300e+04 8.261333e+00]
 [1.566900e+04 1.250185e+00]] (19, 2)
相关系数: PearsonRResult(statistic=0.3903421592849475, pvalue=0.09848176716153914)

2.6主成分分析

2.6.1什么是主成分分析

定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据,创造新的变量

作用:是数据维数压缩,尽可能降低原数据的维度(复杂度),损失少量的信息

应用:回归分析或者聚类分析当中

n_components:

  • 小数:表示保留百分之多少的信息
  • 整数:减少到多少特征

import jieba
from sklearn.decomposition import  PCA
from scipy.stats import  pearsonr
import pandas as pd
import matplotlib.pyplot as plt
#归一化
#1.获取数据
def pca_demo():
    data=[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
    #2.实例化一个转换器类
    transfer=PCA(n_components=2)#四个特征降成两个特征

    #调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new,data_new.shape)
    return  None
if __name__=="__main__":
    pca_demo()

2.6.2案例:探究用户对物品类别的喜好细分降维

文件下载地址:Instacart Market Basket Analysis | Kaggle

 

 


from sklearn.decomposition import PCA
#3.找到user_id和aisle之间的关系
import pandas as pd
#1.获取数据
order_products=pd.read_csv("./order_products__prior.csv")
products=pd.read_csv("./products.csv")
orders=pd.read_csv("./orders.csv")
aisles=pd.read_csv("./aisles.csv")

#2.合并表
#order_products__prior.csv订单与商品信息
#字段:order_id,product_id,add_to_cart_order,reordered
#products.csv商品信息
#字段:product_id,product_name,aisle_id,department_id
#orders.csv用户订单信息
#字段:order_id,user_id,eval_set,order_number,order_dow,order_hour_of_day,days_since_prior_order
#aisles.csv:商品所属具体类别
#字段:aisle_id,aisle
#合并aisles和products
table=pd.merge(aisles,products,on=["aisle_id","aisle_id"])#左表,右表
table1=pd.merge(table,order_products,on=["product_id","product_id"])
table2=pd.merge(table1,orders,on=["order_id","order_id"])
#找到user_id和aisle之间的关系
table3=pd.crosstab(table2["user_id"],table2["aisle"])
data=table3[:10000]
#PCA降维
#实例化一个转换器类
transfer=PCA(n_components=0.95)
#调用fit_transform
data_new=transfer.fit_transform(data)

print(data_new,data_new.shape)

 [[-2.36456828e+01  2.30028678e+00 -2.71706275e+00 ...  8.24685231e-01
  -5.20365905e-01  2.99847178e+00]
 [ 6.95477119e+00  3.54966052e+01  2.52655545e+00 ... -1.15326520e+00
  -1.37969318e+00 -1.07115466e-02]
 [-7.47792843e+00  2.83147785e+00 -1.07306519e+01 ... -3.55104796e-01
   3.85595697e-02  1.92318882e+00]
 ...
 [-2.86664024e+01 -1.26446961e+00 -1.14908062e+00 ...  1.13859569e-03
   4.14189764e-01  4.46163585e-01]
 [-2.88378748e+01 -1.70490822e+00 -1.47059942e+00 ... -1.62743887e-01
   6.72795951e-01  9.64403654e-02]
 [ 2.10412407e+02 -3.51935647e+01  1.33671987e+01 ...  1.46544596e+01
   1.56764794e+01  1.67432890e+01]] (10000, 42)

3.分类算法

3.1 sklearn转换器和估计器

3.1.1转换器

特征工程的步骤:

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

我们把特征工程的接口称之为转换器,其中转换器有这么几种形式

  • fit_transform
  • fit     计算每一列的平均值,标准差
  • transform

区别如下:

from sklearn.preprocessing import StandardScaler
std1=StandardScaler()
a=[[1,2,3],[4,5,6]]
print(std1.fit_transform(a))
std2=StandardScaler()

print(std2.fit(a))#没有这个会报错

print(std2.transform(a))

 结果: 

[[-1. -1. -1.]
 [ 1.  1.  1.]]
StandardScaler()
[[-1. -1. -1.]
 [ 1.  1.  1.]]

3.1.2估计器(sklearn机器学习算法的实现)

估计器(estimator)

1.用于分类的估计器:

  • sklearn.neighbors k-近邻算法
  • sklearn.naive_bayes 贝叶斯
  • sklearn.linear_model.LogisticRegression逻辑回归
  • sklearn.tree 决策树与随机森林

2.用于回归的估计器

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

3.用于无监督学习的估计器

  • sklearn.cluster.KMeans 聚类

 3.2K-近邻算法(KNN)

3.2.1定义

如果一个样本在特征空间中的k个最相似(特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,KNN算法最早由Cover和Hart提出的一种分类算法

3.2.2距离公式(欧式距离)

比如说,a(a1,a2,a3),b(b1,b2,b3)

 k 值取得过小,容易受到异常点的影响k 值取得过大,样本不均衡的影响

3.2.2案例1:鸢尾花种类预测

  • 获取数据
  • 数据集划分
  • 特征工程
  • KNN预估器流程
  • 模型评估
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
def knn_iris():
    iris=load_iris()
    #划分数据集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=6)
    #标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test)
    #KNN算法预估器
    estimator=KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train,y_train)
    #模型预估
    #1.方法一:直接比对真实值和预测值
    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比对真实值和预测值:\n",y_test==y_predict)
    #方法2:计算准确率
    score=estimator.score(x_test,y_test)
    print("准确率为:\n",score)
    return None
if __name__=="__main__":
    knn_iris()

结果:

y_predict:
 [0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1 2]
直接比对真实值和预测值:
 [ True  True  True  True  True  True False  True  True  True  True  True
  True  True  True False  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True False  True
  True  True]
准确率为:0.9210526315789473

3.2.3K-近邻总结

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

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

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

 3.3模型选择和调优

sklearn.model_selection.GridSearchCV(estimator,param_gid=None,cv=None)

  • 对估计器的指定参数值进行详尽搜索
  • estimator:估计器对象
  • param_grid:估计器参数{dict}{"n_neighbors":[1,3,5]}
  • cv:指定几折交叉验证
  • fit():输入训练数据
  • score():准确率
  • 结果分析:
    • 最佳参数:best_params_
    • 最佳结果:best_estimator_
    • 最佳估计器:best_estimator_
    • 交叉验证结果:cv_results_

3.3.1交叉验证

将拿到的训练数据,分为训练和验证集

3.3.2超参数搜索-网格搜索

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的k值),这种叫做超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。

3.3.3鸢尾花案例增加k值调优

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小木猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值