黑马程序员——三天快速入门python机器学习(二)


数据集

可用数据集

  1. Kaggle
  1. UCI
  1. scikit-learn

scikit-learn

  1. 介绍
  • scikit-learn中文社区: http://scikit-learn.org.cn/
  • Python语言的机器学习工具
  • scikit-learn 包括许多知名机器算法的实现
  • 文档完善,易上手,丰富的API
  • 目前稳定版本 0.19.1
  1. 内容
    在这里插入图片描述

sklearn 数据集

  1. sklearn 数据集API介绍
  • sklearn.datasets.load_*()
    用于获取小规模数据集,数据包含在datasets里
  • sklearn.datasets.fetch_*(data_home=None)
    获取大规模数据集,需从网络上下载,函数的第一个参数是data_home,表示数据下载的目录,不指定的话默认~/scikit_learn_data/
  1. sklearn小数据集

举例:

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

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

  1. sklearn大数据集
  • sklearn.datasets.fetch_20newsgroups(data=None, subset=‘train’)
    subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集
    训练集选‘train’,测试集选’test’,两者的‘all’
  1. sklearn数据集的使用
  • load和fetch返回的数据类型为datasets.base.Bunch(字典格式)
  • 键值对:
    data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarry数组
    target:标签数组,是n_samples的一维numpy.ndarry数组
    DESCR:数据描述
    feature_names:特征名,新闻数据,手写数字、回归数据集没有
    target_names:标签名
  • 两种获取键值对的方式:dict[‘‘key’’]=value 和 bunch.key=value
from sklearn.datasets import load_iris

def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    # 获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])           
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值:\n", iris.data, iris.data.shape)  # shape:(150,4)
    return None

if __name__ == "__main__":
    datasets_demo()
  1. 数据集的划分
  • 机器学习一般的数据集会划分为两个部分:
    训练数据:用于训练,构建模型
    测试数据:模型检验,评估模型是否有效
  • 划分比例:
    训练集:80%~70%
    测试集:20%~30%
  1. 数据集划分api

sklearn.model_selection.train_test_split(arrays, options)

  • x 数据集的特征值 ; y 数据集的标签值
  • test_size测试集的大小,一般为float,不设定则按默认值
  • random_state 随机数种子,不同的种子会造成不同的随机采样结果 , 相同的种子采样结果相同。
  • return 训练集特征值 x_train,测试集特征值 x_test,训练集目标值 y_train,测试集目标值 y_test
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split


def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    # 获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"]) #字典方式获取键值对
    print("查看特征值的名字:\n", iris.feature_names) #点属性方式获取键值对
    print("查看特征值:\n", iris.data, iris.data.shape)  # 150个样本

    # 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)   # 返回为150*0.8=120个样本
    return None

if __name__ == "__main__":
    datasets_demo()
  1. 代码运行
    我使用的是Anaconda(CSND上搜索安装教程),Anaconda是包管理器和环境管理器,里面附带了大批常用科学数据包,包括我们所要学习的sklearn数据集
  • 安装好之后进入Anaconda,点击Jupyter下方的luanch

在这里插入图片描述

  • 点击New里面的Python3
    在这里插入图片描述
  • 将代码复制进去,然后点击运行就可以得到数据集
    在这里插入图片描述

特征工程

特征工程介绍

定义:特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:特征工程会直接影响机器学习的效果。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

特征工程的位置与数据处理的比较

  • pandas:一个数据读取非常方便以及基本的处理格式的工具(数据清洗、数据处理)
  • sklearn:对于特征的处理提供了强大的接口(特征工程)
  • 特征工程包含内容:特征抽取(或提取);特征预处理;特征降维

特征提取

定义:将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值是为了计算机更好的去理解数据

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

特征提取API: sklearn.feature_extraction

字典特征提取

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

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

  • DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵
  • DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names():返回类别名称

应用
字典特征提取:将类别转换为one-hot编码,节省内存,提高下载效率

from sklearn.feature_extraction import DictVectorizer
# 特征提取

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京', 'temperature':100},
            {'city':'上海', 'temperature':60},
            {'city':'深圳', 'temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)
     # 如果是True则返回sparse矩阵(稀疏矩阵)会将非零值按位置表示,节省内存,提高加载效率
      
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)   # 转化后的
    print("特征名字:\n", transfer.get_feature_names())

    return None


if __name__ == "__main__":
    dict_demo()

运行得到:

data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
 特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']

应用场景

  • 数据集当中类别特征比较多:将数据集的特征转化为字典类型,用 DictVectorizer 进行特征抽取
  • 本身拿到的数据就是字典类型

文本特征提取

作用:对文本数据进行特征值化,一般用单词作为特征

方法一:CountVectorizer

API

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
返回词频矩阵,stop_words:停用词,

  • CountVectorizer.fit_transform(X)
    X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵

  • CountVectorizer.inverse_transform(X)
    X:array数组或者sparse矩阵,返回值:转换之前数据格

  • CountVectorizer.get_feature_names()
    返回值:单词列表

英文文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
# 导入转换器类

def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['life is short,i like like python',
            'life is too long,i dislike python']
    # 1、实例化一个转换器类
   # transfer = CountVectorizer(stop_words=["is","too"]) 使用停用词,将不计入该词
    transfer = CountVectorizer()
    
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  
    # toarray:将sparse转换为二维数组
    print("特征名字:\n", transfer.get_feature_names())
    return None
    
if __name__ == "__main__":
    count_demo()

运行结果

data_new:
 [[0 1 1 2 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
特征名字:
 ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

中文文本特征提取

  1. 手动分词
from sklearn.feature_extraction.text import CountVectorizer

def count_Chinese_demo():
    """
    中文文本特征抽取:CountVectorizer
    手动分词
    :return:
    """
    data = ['我 爱 北京 天安门',
            '天安门 上 太阳 升'] 
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray:转换为二维数组
    print("特征名字:\n", transfer.get_feature_names())

    return None

if __name__ == "__main__":
    count_demo()

运行结果

data_new:
 [[1 1 0]
 [0 1 1]]
特征名字:
 ['北京', '天安门', '太阳']
  1. jieba分词处理(自动分词)
from sklearn.feature_extraction.text import CountVectorizer
import jieba  #导入jieba库

def count_chinese_demo2():
    '''
    中文文本特征提取
    '''
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
    transfer=CountVectorizer() #可加stop_word
    data_final=transfer.fit_transform(data_new)
    print('data_final=\n',data_final.toarray())
    print('特征名字:\n',transfer.get_feature_names())
    return None


def cut_word(text):
    '''进行中文分词'''
    a=' '.join(list(jieba.cut(text)))
    print(a)
    return a

if __name__=="__main__":
    count_chinese_demo2()

运行结果

一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。
我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。
如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
data_final=
 [[2 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 1
  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 0
  1]
 [1 1 0 0 4 2 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
  0]]
特征名字:
 ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

关键词:再某一类别的文章中,出现次数很多,但在其他类别的文章中出现很少

方法二: TfidfVectorizer

重要性:分类机器学习算法进行文章分类中前期数据处理方式

  1. API:类比CountVectorizer的API

  2. TF_IDF文本特征提取

  • TF-IDF:衡量特征词的重要程度
  • 主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
  • 作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
  • 词频(term frequency,TF):某给定词语在文中出现的频率
  • 逆向文档频率(inverse document frequency,IDF):词语普遍重要性的度量。
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba

def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    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("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

def cut_word(text):
    '''进行中文分词'''
    a=' '.join(list(jieba.cut(text)))
    print(a)
    return a

if __name__ == "__main__":
    tfidf_demo()

运行结果

今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。
我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。
如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
['今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
data_final:
 [[0.         0.         0.2236068  0.         0.         0.
  0.4472136  0.         0.         0.         0.         0.
  0.2236068  0.         0.         0.         0.         0.
  0.2236068  0.2236068  0.         0.4472136  0.         0.2236068
  0.         0.4472136  0.2236068  0.         0.         0.
  0.2236068  0.2236068  0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  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.16765125 0.16765125 0.         0.         0.670605   0.3353025
  0.         0.         0.         0.         0.16765125 0.16765125
  0.         0.16765125 0.16765125 0.16765125 0.         0.1275031
  0.         0.         0.16765125 0.         0.         0.
  0.16765125 0.         0.         0.         0.3353025  0.16765125
  0.         0.         0.16765125 0.         0.        ]]
特征名字:
 ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝大部分', '美好', '联系', '过去', '这样']
data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
 特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
《人工智能实践教程——从Python入门机器学习》是一本非常有价值的电子书。该书从Python编程语言入门开始,逐步引导读者了解人工智能的相关概念和知识,并介绍了如何使用Python进行人工智能的实践。 在这本电子书中,作者通过简明的语言和实例来解释Python的基本语法和常用库,帮助读者快速上手Python编程。然后,逐步介绍了人工智能的基础知识,如神经网络、深度学习和机器学习等。读者可以通过书中的实践项目,学习如何使用Python进行数据处理、特征提取、模型训练和结果评估等。 特别值得一提的是,该书在讲解算法和模型原理的同时,也加入了大量的实践示例和代码。读者可以通过实践项目,亲自动手实现和调试,加深对人工智能算法和技术的理解和掌握。 这本电子书的优点在于: 1. 清晰明了的语言和实例,易于理解和掌握。 2. 结合理论和实践,帮助读者建立起算法和模型的直观认知。 3. 丰富的实践项目和代码示例,帮助读者真正学会如何运用Python进行人工智能实践。 4. 概念讲解详尽,适合初学者学习,也可作为已有基础的读者进行实践项目的参考。 总之,这本电子书是一本很实用的教程,对于想要学习人工智能并具备一定Python编程基础的读者来说,是一本值得推荐的指导书。读者可以通过该书学习到从Python入门机器学习的全过程,并获得实际应用的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洛不必达

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

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

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

打赏作者

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

抵扣说明:

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

余额充值