python 机器学习(一)机器学习概述与特征工程
一、机器学习概述
1.1、什么是机器学习?
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
1.2、为什么需要机器学习?
- 解放生产力,智能客服,可以不知疲倦的24小时作业
- 解决专业问题,ET医疗,帮助看病
- 提供社会便利,例如杭州的城市大脑
1.3、机器学习应用场景
- 自然语言处理
- 无人驾驶
- 计算机视觉
- 推荐系统
二、数据来源与类型
2.1、数据的来源
- 企业日益积累的大量数据(互联网公司更为显著)
- 政府掌握的各种数据
- 科研机构的实验数据
2.2、数据的类型
数据的类型将是机器学习模型不同问题不同处理的依据。数据的类型包括:
离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。
注意:
- 只要记住一点,离散型是区间内不可分,连续型是区间内可分
2.3、可用的数据集
scikit-learn:数据量较小 ,方便学习。
UCI:收录了360个数据集,覆盖科学、生活、经济等领域 ,数据量几十万。
Kaggle:大数据竞赛平台,80万科学家,真实数据,数据量巨大。
常用数据集数据的结构组成:特征值+目标值,如下图:
三、数据的特征工程
3.1、特征工程是什么?
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
3.2、特征工程的意义
意义:直接影响模型的预测结果。
3.3、scikit-learn
- Python语言的机器学习工具
- Scikit-learn包括许多知名的机器学习算法的实现
- Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。
- 目前稳定版本0.18
- 安装:pip3 install Scikit-learn
- 引用:import sklearn
3.4、数据的特征抽取
3.4.1、特点:
- 特征抽取针对非连续型数据
- 特征抽取对文本等进行特征值化
3.4.2、sklearn特征抽取API :
sklearn.feature_extraction
3.4.3、字典特征抽取 :
作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
DictVectorizer语法:
DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
流程:
1、实例化类DictVectorizer
2、调用fit_transform方法输入数据并转换
举一个栗子:
from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer(sparse=False)
data = dict.fit_transform([{'name': '张飞','score': 70}, {'name': '赵云','score':100}, {'name': '刘备','score': 98}])
print(dict.get_feature_names())
print(data)
运行结果:
['name=刘备', 'name=张飞', 'name=赵云', 'score']
[[ 0. 1. 0. 70.]
[ 0. 0. 1. 100.]
[ 1. 0. 0. 98.]]
从中,我们可以看出:对于字典 [{'name': '张飞','score': 70}, {'name': '赵云','score':100}, {'name': '刘备','score': 98}] ,DictVectorizer类将汉字(张飞,赵云,刘备)转成了one-hot编码(0,1,0),而数值类型的数据(70,100,98)是不做处理的。
什么是one-hot编码?
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
3.4.4、文本特征抽取
作用:对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer语法:
CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵
CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
CountVectorizer.get_feature_names()
返回值:单词列表
流程:
1、实例化类CountVectorizer
2、调用fit_transform方法输入数据并转换
举一个栗子:
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform(["我爱学习,学习使我进步", "我爱work,work 使我快乐"])
print(cv.get_feature_names())
print(data.toarray())
运行结果:
['work', '使我快乐', '学习使我进步', '我爱work', '我爱学习']
[[0 0 1 0 1]
[1 1 0 1 0]]
可以看到,API中的CountVectorizer类将中文转换成了单个词语,并给每个词语的出现个数进行了统计。有一点要注意的是,程序并不会给中文分词,所以,例子中,‘学习使我进步’程序认为是一个词语,这种情况下,可以用空格,或者逗号,将中文进行分割。还有一点要注意的是,如果是英文的话,是不会统计单个字母的,因为字母的统计是没有意义的,同理,CountVectorizer也不支持单个中文字。
我们可以验证一下栗子:
英文栗子:
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform(["I like study , study makes me happy", "I am a good student"])
print(cv.get_feature_names())
print(data.toarray())
运行结果:
['am', 'good', 'happy', 'like', 'makes', 'me', 'student', 'study']
[[0 0 1 1 1 1 0 2]
[1 1 0 0 0 0 1 0]]
中文栗子:
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform(["我 热爱 学习, 学习 使我 进步", "我 是 一个 好学生"])
print(cv.get_feature_names())
print(data.toarray())
运行结果:
['一个', '使我', '好学生', '学习', '热爱', '进步']
[[0 1 0 2 1 1]
[1 0 1 0 0 0]]
从中文栗子和英文栗子中,我们可以看到单个英文和单个中文是不会统计数量的,因为统计单个中文或者英文是没有意义的。
手动加空格,或者加逗号分隔始终是指标不治本,如果给我们一篇文章,让我们去处理的话,那要累到手瘫了。那么,有没有好的办法呢?是有的,那就是用 python 里提供的 jieba 分词类库。
我们再来举一个栗子:
import jieba
from sklearn.feature_extraction.text import CountVectorizer
con1 = jieba.cut("我热爱学习,学习使我感到进步。")
con2 = jieba.cut("我热爱工作,工作可以让我感到快乐。")
con3 = jieba.cut("如果不让我学习,也不让我工作,我会觉得浑身不舒服。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
运行结果:
我 热爱 学习 , 学习 使 我 感到 进步 。 我 热爱工作 , 工作 可以 让 我 感到 快乐 。 如果 不让 我 学习 , 也 不让 我 工作 , 我会 觉得 浑身 不 舒服 。
['不让', '可以', '如果', '学习', '工作', '快乐', '感到', '我会', '浑身', '热爱', '热爱工作', '舒服', '觉得', '进步']
[[0 0 0 2 0 0 1 0 0 1 0 0 0 1]
[0 1 0 0 1 1 1 0 0 0 1 0 0 0]
[2 0 1 1 1 0 0 1 1 0 0 1 1 0]]
从栗子中可以看到,jieba分词包把句子进行了分词,然后对每个词语的个数进行了统计,但是对于 ‘我’、 ‘也’ 这样的单个中文,并没有统计个数,因为这样的单个中文统计没有意义。
至此,我们学会了统计文章中英文和中文的词语的个数,那么,单纯统计一个词语出现的个数越多就表示这个词语在文章中越重要吗?那比如,“我们”,“你们”,“他们”,“你的”,这样的指示代词出现的频率应该是最高的,能说明代词是文章的重点吗?显然不是。怎么过滤掉这种出现很多,但是并不是重点的词语呢?我们就要开始学习一种 TF-IDF 的处理方法了。
3.4.5、TF-IDF
主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法:
TfidfVectorizer(stop_words=None,…)
返回词的权重矩阵
TfidfVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
返回值:单词列表
我们开始举个栗子:
import jieba
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
con1 = jieba.cut("我们热爱学习,学习使我们感到进步。")
con2 = jieba.cut("我们热爱工作,工作可以让我们感到快乐。")
con3 = jieba.cut("如果不让我们学习,不让我们工作,就会感到浑身不舒服。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
运行结果:
我们 热爱 学习 , 学习 使 我们 感到 进步 。 我们 热爱工作 , 工作 可以 让 我们 感到 快乐 。 如果 不让 我们 学习 , 不让 我们 工作 , 就 会 感到 浑身 不 舒服 。
['不让', '可以', '如果', '学习', '工作', '快乐', '感到', '我们', '浑身', '热爱', '热爱工作', '舒服', '进步']
[[0. 0. 0. 0.61800047 0. 0.
0.23996625 0.4799325 0. 0.40629818 0. 0.
0.40629818]
[0. 0.43345167 0. 0. 0.32965117 0.43345167
0.25600354 0.51200708 0. 0. 0.43345167 0.
0. ]
[0.63561168 0. 0.31780584 0.24169953 0.24169953 0.
0.18770125 0.3754025 0.31780584 0. 0. 0.31780584
0. ]]
我们可以看到,通过 TF-IDF 的处理,把每句话的重点单词找出来了,第一句话 “我们” 和 “学习” 都出现了2次 ,但 “学习”是0.61800047,“我们” 是0.4799325, 重点是 “学习” , 第三句话“我们” 和 “ 不让 ” 都出现了2次 ,但 “不让”是0.63561168 ,“我们” 是0.3754025 , 第三句话重点强调 “不让” ,因为 “我们” 在三句话中都频繁出现,并不是每一句话的 “专属” , 也就不是一句话的重点了。
3.5、数据的特征处理
3.5.1、特征处理是什么?
通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
3.5.2、为什么需要特征处理?
每个特征的单位不一样,比如相亲的时候,有乘坐飞机的里程数,人的身高,玩游戏的时间,里程数的数值很大,身高相对里程数值很小,那么在做分析的时候,里程数的数值就会起决定性作用。事实在,在统计分析的时候,分析人员认为每个特征同样重要。所以我们需要把不同单位的数值进行特征处理,不因为数值的相差巨大而造成特征的差别。
3.5.3、特征处理的方法
数值型数据:(标准缩放)
1、归一化
2、标准化
3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分
3.5.4、归一化:
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间。
公式:
python 机器学习(一)机器学习概述与特征工程的更多相关文章
- 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26 ...
- Python机器学习笔记 使用sklearn做特征工程和数据挖掘
特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...
- python 机器学习库 —— featuretools(自动特征工程)
文档:https://docs.featuretools.com/#minute-quick-start 所谓自动特征工程,即是将人工特征工程的过程自动化.以 featuretools 为代表的自动特 ...
- 【Python数据挖掘】第六篇--特征工程
一.Standardization 方法一:StandardScaler from sklearn.preprocessing import StandardScaler sds = Standard ...
- 如何用Python做自动化特征工程
机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理.而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练那样能产生直接可用的结果.本文作者将使用 ...
- 2022年Python顶级自动化特征工程框架⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...
- AI学习笔记:特征工程
一.概述 Andrew Ng:Coming up with features is difficult, time-consuming, requires expert knowledge. &quo ...
- Python数据科学手册-机器学习之特征工程
特征工程常见示例: 分类数据.文本.图像. 还有提高模型复杂度的 衍生特征 和 处理 缺失数据的填充 方法.这个过程被叫做向量化.把任意格式的数据 转换成具有良好特性的向量形式. 分类特征 比如房屋数 ...
- 机器学习-特征工程-Missing value和Category encoding
好了,大家现在进入到机器学习中的一块核心部分了,那就是特征工程,洋文叫做Feature Engineering.实际在机器学习的应用中,真正用于算法的结构分析和部署的工作只占很少的一部分,相反,用于特 ...
随机推荐
- apache虚拟主机配置-域名/IP和端口两种配置
由于百度上有非常详细的资料,我这里就转载而已:https://jingyan.baidu.com/article/4f7d5712d48a191a201927e0.html
- input type file onchange上传文件的过程中,同一个文件二次上传无效的问题。
不要采用删除当前input[type=file]这个节点,然后再重新创建dom这种方案,这样是不合理的.解释如下:input[type=file]使用的是onchange去做,onchange监听的为 ...
- MySQL系列(三)
本章内容: 视图.增/删/改/查 触发器.增/删/改/查 存储过程.增/删/改/查 存储过程三种传参,pymysql 怎么用? 函数.增/删/改/查/return值 内置函数 事务 1.1视图 视图是 ...
- 【linux三剑客】sed命令
sed - stream editor for filtering and transforming text sed 流编辑器 strem edition,实现对文件的增删改替换查是Linux中第二 ...
- python笔记 函数初识
1. 函数: 封装一个功能 def my_len(形参): -> def 声明定义一个函数 my_len 函数名命名规则同变量 ······ - ...
- 2020年ubuntu1804安装nginx最新稳定版1.16详细教程笔记
第一次使用nginx是2007年,当时主流还是apache.nginx横空出世,在web2.0的推动下,迅速崛起.眼下已是绝对的主流了. 当时,还有一个轻量级的lighttpd,是德国人写,刚开始还并 ...
- MySQL如何安装-教程
1.先从官网上下载Mysql压缩包https://dev.mysql.com/downloads/mysql/2.解压出来的mysql压缩包是没有图片中的data文件夹和my.ini 如图所示: 3. ...
- nginx判定国家ip访问网站
我们可以通过GeoIP模块和MaxMind免费数据库来实现.MaxMind具有新版本的数据库GeoLite2,它仅支持CSV和mmdb格式.可以支持mngx_http_geoip2_modulemdb ...
- windows远程执行命令总结
1. 利用Impacket Impacket是一个Python类库,用于对SMB1-3或IPv4 / IPv6 上的TCP.UDP.ICMP.IGMP,ARP,IPv4,IPv6,SMB,MSRPC, ...
- N - 寿司晚宴 HYSBZ - 4197 状压dp
N - 寿司晚宴 HYSBZ - 4197 推荐题解 这个题目我觉得还是很难的,借助题解写出来的,题解还看了很久,现在还是不是很理解. 首先这个数比较大有500,如果直接就像这个题目S - Query ...