机器学习概述
- 机器学习是从
数据
中自动分析获得规律(模型)
,并利用规律对未知数据进行预测
。
数据集的组成
- 机器学习的数据:多数都是文件CSV
- 不用mysql等数据库:1、性能瓶颈、读取速度 2、格式不太符合机器学习的要求的格式
- pandas:读取工具
- numpy: 释放了GIL锁
可用的数据集
- kaggle特点:1、大数据竞赛平台 2、80万科学家 3、真实数据 4、数据量巨大
- scikit-learn特点:1、数据量较小 2、方便学习
- UCI特点:1、收录360个数据集 2、覆盖科学、生活、经济等领域 3、数据量几十万
常用数据集的数据结构组成
-
特征值 + 目标值
- pandas:一个数据读取非常方便以及基本的处理格式的工具
- sklearn: 对于
特征的处理
提供强大的接口
1、特征抽取
-
对文本等数据进行特征值化(是为了计算机更好的去理解数据)
API:sklearn.feature_extraction
- 字典数据特征抽取
1、实例化:DictVectorizer
2、调用:fit_transform
例子:from sklearn.feature_extraction import DictVectorizer def dictvec(): data_list = [ {'city': '北京', 'temp': 100}, {'city': '上海', 'temp': 60}, {'city': '广州', 'temp': 120}, {'city': '成都', 'temp': 80} ] # 1、实例化 mydict = DictVectorizer() # 2、调用fit_transform data = mydict.fit_transform(data_list) print(data) return None if __name__ == '__main__': dictvec()
输出,sparse矩阵
如果实例化时,进行了设置,则如下
# 1、实例化 mydict = DictVectorizer(sparse=False)
结果:ndarry 二维数组
- 字典数据抽取:把字典中一些类别数据,分别进行转换成特征
- 文本特征抽取
作用:对文本特征值化
类:sklearn.feature_extraction.text.CountVectorizer
使用与字典数据抽取类似,例子from sklearn.feature_extraction.text import CountVectorizer def countvec(): # 对文本进行特征值化 cv = CountVectorizer() data = cv.fit_transform(['life is short, i like python', 'life is too long, i dislike python']) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == '__main__': countvec()
结论:(1、单个字母不统计 2、统计文章中所有的词,3、记录在词列表中出现的次数)
针对中文:(需要使用jieba库进行分词)
中文特征抽取例子:from sklearn.feature_extraction.text import CountVectorizer import jieba def countvec(): # 对文本进行特征值化 cv = CountVectorizer() data = cv.fit_transform(['人生苦短,我用python', 'life is too long, i dislike python']) # print(cv.get_feature_names()) # print(data.toarray()) return None def cutword(): 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) return c1, c2, c3 def hanzivec(): c1, c2, c3 = cutword() print(c1, c2, c3) # 中文特征值化 cv = CountVectorizer() data = cv.fit_transform([c1, c2, c3]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == '__main__': # countvec() hanzivec()
结果:
- 字典数据特征抽取
tf
:term frequency 词的频率 出现的次数idf
:inverse document frequency 逆文档频率 计算方式: log(总文档数量/该词出现的文档数量)-
tf * idf
:重要性程度
例子:from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer import jieba def cutword(): 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) return c1, c2, c3 def tfidfvec(): c1, c2, c3 = cutword() print(c1, c2, c3) # 中文特征值化 cv = TfidfVectorizer() data = cv.fit_transform([c1, c2, c3]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == '__main__': tfidfvec()
结果
2、特征预处理
- 定义:通过
特定的统计方法(数学方法)
将数据
转换成算法要求的数据
数值型数据:
—> 标准缩放 1、归一化 2、标准化 3、缺失值
类别型数据:one-hot 编码
时间类型:时间的切分 - API:
sklearn.preprocessing
-
归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
计算公式:
sklearn归一化API:sklearn.preprocessing.MinMaxScaler
例子:from sklearn.preprocessing import MinMaxScaler def mm(): mm = MinMaxScaler() data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]]) print(data) return None if __name__ == '__main__': mm()
结果:
如果在
MinMaxScaler(feature_range=(2, 3))
指定区间
结果:
特征同等重要的时候:进行归一化
目的:使得某一个特征对最终结果不会造成更大的影响
归一化的总结:
-
- 标准化
1、特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内
综合对比:
sklearn标准差API:sklearn.preprocessing.StandardScaler
例子:from sklearn.preprocessing import StandardScaler def stand(): std = StandardScaler() data = std.fit_transform([[1., -1., 3.],[2., 4., 2.],[4., 6., -1.]]) print(data) return None if __name__ == '__main__': stand()
结果:
标准化总结:
在已有样本足够多的情况下比较稳定,适合现代嘈杂的大数据场景。 - 缺失值
处理方法:
可使用replace('?', 'np.nan')
替换‘缺失值’为np.nan
格式,属于float类型
例子:from sklearn.preprocessing import imputer import numpy as np def im(): im = imputer(missing_values='NaN', strategy='mean', axis=0) data = im.fit_transform([[1, 2], [np.nan, 3],[7, 6]]) print(data) return None if __name__ == '__main__': im()
结果:
3、降维:这里的维度指的是特征的数量
-
特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值,也可以不改变值
,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中一部分特征。
- 过滤式:从方差大小的角度来考虑所有样本这个特征的数据情况
API:sklearn.feature_selection.VarianceThreshold
例子:
from sklearn.feature_selection import VarianceThreshold def var(): """ s特征选择-删除低方差特征 """ var = VarianceThreshold(threshold=0.0) data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3],[0, 1, 1, 3]]) print(data) return None if __name__ == '__main__': var()
结果:
如果var = VarianceThreshold(threshold=1.0)
,则结果是:
- 过滤式:从方差大小的角度来考虑所有样本这个特征的数据情况
-
主成分分析(PCA)
API:sklearn.decomposition
特征数量达到上百的时候,考虑数据的简化特征
PCA的计算公式:
PCA语法:
PCA(n_components=None)
:将数据分解为低维数空间
n_components 为小数(通常90%-95%)或整数(减少到的特征数量,一般不使用)
例子:from sklearn.decomposition import PCA def pca(): """ 主成分分析,进行特征降维 """ pca = PCA(n_components=0.9) data =pca.fit_transform([2, 8, 4, 5], [6, 3, 0, 8],[5, 4, 9, 1]]) print(data) return None if __name__ == '__main__': pca()
结果: