机器学习 第二讲 Scikit-learn

在这里插入图片描述

一、Scikit-learn库介绍

在这里插入图片描述

1.Python语言的机器学习工具

2.Scikit-learn包括许多知名的机器学习算法的实现

3.Scikit-learn文档完善,容易上手,丰富的API

二、安装scikit-learn库:打开cmd命令行窗口

pip install scikit-learn -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
在这里插入图片描述

三、数据的特征抽取

from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform([‘life is short,i like python’,‘life is too long’])
print(vector.get_feature_names())
print(res.toarray())

1.sklearn特征抽取API

sklearn.feature_extraction

# 数据的特征抽取
# 将一个文本转换为一串数字
from sklearn.feature_extraction.text import CountVectorizer

vector = CountVectorizer()
res = vector.fit_transform(['life is short,i like python','life is too long'])
print(vector.get_feature_names())
# ['is', 'life', 'like', 'long', 'python', 'short', 'too']
print(res.toarray())
# [[1 1 1 0 1 1 0]
#  [1 1 0 1 0 0 1]]

2.字典特征抽取

作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer

# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer


def dictvec():
    """
    字典数据抽取
    :return: None
    """

    dic = DictVectorizer()

    data = dic.fit_transform([{'city': '北京', 'temp': 30}, {'city': '上海', 'temp': 20}, {'city': '深圳', 'temp': 40}])

    # sparse矩阵
    print(data)
    '''
      (0, 1)	1.0
      (0, 3)	30.0
      (1, 0)	1.0
      (1, 3)	20.0
      (2, 2)	1.0
      (2, 3)	40.0'''
    print(dic.get_feature_names())
    '''['city=上海', 'city=北京', 'city=深圳', 'temp']'''


if __name__ == '__main__':
    dictvec()

3.文本特征抽取

作用:对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer


def countvec():
    """
    对文本进行特征值化
    :return: None
    """
    cv = CountVectorizer()
    data = cv.fit_transform(['life is short,i like python', 'life is too long'])
    print(cv.get_feature_names())
    '''
    ['is', 'life', 'like', 'long', 'python', 'short', 'too']'''
    print(data)
    '''
      (0, 1)	1
      (0, 0)	1
      (0, 5)	1
      (0, 2)	1
      (0, 4)	1
      (1, 1)	1
      (1, 0)	1
      (1, 6)	1
      (1, 3)	1'''
    print(data.toarray())
    '''
    [[1 1 1 0 1 1 0]
     [1 1 0 1 0 0 1]]'''


if __name__ == '__main__':
    countvec()

4.jieba分词

import jieba
jieba.cut(“人生苦短,我用Python”)
words = ’ '.join(data)
print(words)
jieba分词的安装:pip install jieba -i https://pypi.douban.com/simple --trusted-host pypi.douban.com
在这里插入图片描述
在这里插入图片描述

5.案例-对三段话进行特征值化

1、今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不
要放弃今天。
2、我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们
是在看它的过去。
3、如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。

TF:term frequency 词的频率
IDF:Inverse document frequency 逆文档频率
Log:总文档数量/该词出现的文档数
TF*IDF:重要性程度
TF-IDF
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

import jieba
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

'''
1、今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
2、我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。
3、如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
'''


def cutwords():
    s1 = jieba.cut('今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天')
    s2 = jieba.cut('我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去')
    s3 = jieba.cut('如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系')

    c1 = ' '.join(s1)
    c2 = ' '.join(s2)
    c3 = ' '.join(s3)

    return c1, c2, c3


def countvec():
    """
    对汉字进行特征值化
    :return:None
    """
    c1, c2, c3 = cutwords()
    cv = CountVectorizer()
    data = cv.fit_transform([c1, c2, c3])
    print(cv.get_feature_names())
    '''
    ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']'''
    print(data.toarray())
    '''
    [[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]]'''
    return None


def tfidfvec():
    c1, c2, c3 = cutwords()
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())
    '''
    ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']'''
    print(data.toarray())
    '''
    [[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.        ]]
    '''
if __name__ == '__main__':
    # countvec()
    tfidfvec()

6.数据的特征预处理

1、特征处理的方法
2、sklearn特征处理API
特征处理是什么
通过特定的统计方法(数学方法)将数据转换成算法要求的数据

第一组:
在这里插入图片描述
特征处理方案
> 数值型数据-标准缩放:
1.归一化
2.标准化
3.缺失值
> 类别型数据:
1.one-hot编码
> 时间类型:
1.时间的切分

sklearn特征处理API
sklearn. preprocessing
归一化
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:
在这里插入图片描述
作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为
指定区间值默认mx为1,mi为0

归一化公式计算过程
在这里插入图片描述
注:里面是第一步,还需要第二步乘以(1-0)+0

sklearn归一化API
sklearn归一化API: sklearn.preprocessing.MinMaxScaler

MinMaxScalar(feature_range=(0,1)…) 每个特征缩放到给定范围(默认[0,1])

归一化步骤
1、实例化MinMaxScalar
2、通过fit_transform转换

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

标准化
特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
在这里插入图片描述
结合归一化来谈标准化
在这里插入图片描述
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

sklearn特征化API
sklearn特征化API: scikit-learn.preprocessing.StandardScaler
处理之后每列来说所有数据都聚集在均值0附近标准差为1

标准化步骤
1、实例化StandardScaler
2、通过fit_transform转换

归一化处理和标准化处理

# 归一化处理和标准化处理
from sklearn.preprocessing import MinMaxScaler, StandardScaler


def mms():
    """
    归一化处理
    :return:None
    """
    mm = MinMaxScaler(feature_range=(2, 3))  # 默认feature_range=(0,1),一般不做修改
    data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
    print(data)
    '''
    [[3.         2.         2.         2.        ]
     [2.         3.         3.         2.83333333]
     [2.5        2.5        2.6        3.        ]]'''
    return None


def stand():
    """
    标准化处理
    :return:None
    """
    std = StandardScaler()
    data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
    print(data)
    '''
    [[-1.06904497 -1.35873244  0.98058068]
     [-0.26726124  0.33968311  0.39223227]
     [ 1.33630621  1.01904933 -1.37281295]]'''
    return None


if __name__ == '__main__':
    mms()
    stand()

缺失数据的处理

'''
缺失数据的处理
1.删除
2.插补
'''
from sklearn.impute import SimpleImputer
import numpy as np


def im():
    """
    处理缺失数据
    :return: None
    """
    im = SimpleImputer(missing_values=np.nan, strategy='mean')

    li = [[1, 2], [np.nan, 3], [7, 9]]
    print(li)
    '''
    [[1, 2], [nan, 3], [7, 9]]'''
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 9]])
    print(data)
    '''
    [[1. 2.]
     [4. 3.]
     [7. 9.]]'''
    return None


if __name__ == '__main__':
    im()

四、数据的降维

数据的降维之特征选择
在这里插入图片描述

1.特征选择

特征选择
1.特征选择是什么?
2.sklearn特征选择API
3.其他特征选择方法

特征选择原因
冗余
部分特征的相关度高,容易消耗计算性能
噪声
部分特征对预测结果有影响

2.主成分分析

特征分析
特征?
羽毛颜色
眼睛宽度
是否有爪子
爪子长度
在这里插入图片描述

3.特征选择的主要方法

1.Filter(过滤式) VarianceThreshold
2.Embedded(嵌入式) 正则化、决策树
3.Wrapper(包裹式)

VarianceThreshold语法
VarianceThreshold(threshold = 0.0) 删除所有低方差特征

# 过滤式
from sklearn.feature_selection import VarianceThreshold

def var():
    """
    特征选择-删除低方差的特征
    :return: None
    """

    # 删除方差为0的特征
    var = VarianceThreshold(threshold=0.0)

    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    '''
    [
    [0, 2, 0, 3], 
    [0, 1, 4, 3], 
    [0, 1, 1, 3]
    ]
    '''
    print(data)
    '''
    [[2 0]
     [1 4]
     [1 1]]'''
    return None


if __name__ == '__main__':
    var()

sklearn主成分分析API
sklearn.decomposition

PCA是什么
本质:PCA是一种分析、简化数据集的技术,特征数量达到上百的时候,考虑数据的简化
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量

from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA

def var():
    """
    特征选择-删除低方差的特征
    :return: None
    """
    # 删除方差为1的特征
    var = VarianceThreshold(threshold=1)
    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    '''
    [
    [0, 2, 0, 3], 
    [0, 1, 4, 3], 
    [0, 1, 1, 3]
    ]
    '''
    print(data)
    '''
    [[0]
     [4]
     [1]]'''
    return None


def pca():
    """
    主成分分析进行数据降维
    :return:None
    """
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)
    '''
    [[ 1.28620952e-15  3.82970843e+00]
     [ 5.74456265e+00 -1.91485422e+00]
     [-5.74456265e+00 -1.91485422e+00]]'''
    return None


if __name__ == '__main__':
    var()
    pca()

# 特征选择  主成分分析 特征比较多的时候用主成分分析

高纬度数据容易出现的问题
特征之间通常是相关的
数据:
(-1,-2)
(-1, 0)
( 0, 0)
( 2, 1)
( 0, 1)
要求:将这个二维的数据简化成一维?
在这里插入图片描述
在这里插入图片描述

通过公式计算
在这里插入图片描述
矩阵运算得出P为在这里插入图片描述
在这里插入图片描述

通过公式计算
在这里插入图片描述
PCA语法
PCA(n_components=None) 将数据分解为较低维数空间
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值