机器学习
-
什么是机器学习?
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
-
机器学习的应用场景
自然语言处理,无人驾驶,计算机视觉,推荐系统
Scikit_learn库
Python语言的机器学习工具
Scikit-learn包括许多知名的机器学习算法的实现
Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。
目前稳定版本0.18
数据的特征抽取(字典,文本,)
-
通过演示得出结论:
特征抽取针对非连续型数据
特征抽取对文本等进行特征值化
注:特征值化是为了计算机更好的去理解数据
sklearn特征抽取API
sklearn.feature_extraction
字典特征抽取
作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
DictVectorizer语法
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
流程:
实例化类DictVectorizer
调用fit_transform方法传入数据并转换
代码:
from sklearn.feature_extraction import DictVectorizer
def dict():
"""
字典数据特征值化
:return:
"""
dict=DictVectorizer(sparse=False) #实例化类DictVectorizer,返回sparse形式矩阵 默认为true
data=dict.fit_transform([{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}])#调用fit_transform方法传入数据并转换
print("特征值:",dict.get_feature_names())
print(data)
if __name__ == '__main__':
dict()
output:
文本特征抽取
类:sklearn.feature_extraction.text.CountVectorizer
from sklearn.feature_extraction.text import 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()
返回值:单词列表
案例
def txt():
txt=CountVectorizer()
data_txt=txt.fit_transform(["life is short,i like python",
"life is too long,i dislike python"])
print("特征值:", txt.get_feature_names())
print(data_txt.toarray()) #打印结果数字为word出现的频率,返回的是sparse矩阵。要转换为列表(toarray)
-
实例化类CountVectorizer
-
调用fit_transform方法输入数据并转换
##output
注意返回格式,利用toarray()进行sparse矩阵转换array数组
对中文文本特征值化
-
下载:
pip3 install jieba -
使用:
import jiebajieba.cut(“我是一个好程序员”)
-
注意:返回值:词语生成器
案例:
-
准备句子,利用jieba.cut进行分词
-
实例化CountVectorizer
-
将分词结果变成字符串当作fit_transform的输入值
from sklearn.feature_extraction.text import CountVectorizer import jieba #先使用jieba方法切割中文文本 def cut(): s1=("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。") s2=("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。") s3=("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。") #切割文本转为列表形式 txt1 = list(jieba.cut(s1)) txt2 = list(jieba.cut(s2)) txt3 = list(jieba.cut(s3)) #以空格分为字符串形式 t1 = " ".join(txt1) t2 = " ".join(txt2) t3 = " ".join(txt3) return t1,t2,t3 #再抽取文本的特征 def dict(): dict=CountVectorizer() t1,t2,t3=cut() data=dict.fit_transform([t1,t2,t3]) print(dict.get_feature_names()) print(data.toarray()) if __name__ == '__main__': dict()
TF-IDF
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,
并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。 - TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
- 类:sklearn.feature_extraction.text.TfidfVectorizer
导包
from sklearn.feature_extraction.text import TfidfVectorizer
TfidfVectorizer语法
TfidfVectorizer(stop_words=None,…)
返回词的权重矩阵
TfidfVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
返回值:单词列表
案例:
def df():
tf=TfidfVectorizer()
t1,t2,t3=cut()
data=tf.fit_transform([t1,t2,t3])
print(tf.get_feature_names())
print(data.toarray())
output:
sklearn特征处理API
- 类:sklearn. preprocessing
##归一化 - 特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
- 公式:
- 注:作用于每一列,max为一列最大值,min为一列的最小值,那么x`为最终结果,max,min分别为指定区间值默认mx为1,mn为0
归一化公式计算过程
sklearn归一化API
类:sklearn.preprocess.MinMaxScaler
from sklearn.prrprocess import MinMaxScaler
MinMaxScaler语法
MinMaxScalar(feature_range=(0,1)…)
每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
归一化步骤
- 1.实例化MinMaScaler
- 2.通过fit-transform转换
代码:
from sklearn.preprocessing import MinMaxScaler
def dict():
dict=MinMaxScaler()
data=dict.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
if __name__ == '__main__':
dict()
output:
归一化总结
- 注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化
- 特点 :通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内
结合归一化来谈标准化
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn特征化API
-
类: scikit-learn.preprocessing.StandardScaler
-
导包:
from sklearn.preprocess import StandardScaler
StandarScaler语法
StandardScaler(…)
处理之后每列来说所有数据都聚集在均值0附近方差为1
StandardScaler.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
StandardScaler.mean_
原始数据中每列特征的平均值
StandardScaler.std_
原始数据每列特征的方差
标准化步骤
-
实例化StandarScaler
-
通过fit_transform转换数据
代码:
from sklearn.preprocessing import StandardScaler
def dict():
dict=StandardScaler()
data=dict.fit_transform([[900,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
if __name__ == '__main__':
dict():
output:
标准化总结
- 在已有的样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
缺失值
缺失值处理方法:
- 删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
- 插补:可以通过缺失值每行或者每列的平均值、中位数来填充
sklearn缺失值API:
-
类:sklearn.preprocess.Imputer
-
导包:
from sklearn.preprocess import Imputer
Imputer语法
Imputer(missing_values='NaN', strategy='mean', axis=0)
完成缺失值插补
Imputer.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
Imputer流程
- 1.初始化Imputer,指定“缺失值”,指定填补策略,指定行或列
- 注:缺失值也可以是别的指定要替换的值
- 2.调用firt_transform转换数据
关于np.nan(np.NaN)
- 1.numpy的数组中可以使用np.nan/np.NaN来代替缺失值属于float类型
- 2.如果是文件中的一些缺失值,可以替换成nan,通过np.array转换为float行的数组
代码:
from sklearn.preprocessing import Imputer
import numpy as np
def dict():
dict=Imputer(strategy="median",missing_values="NaN")#中位数填补缺失,缺失为NaN
data=dict.fit_transform([[np.nan,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
if __name__ == '__main__':
dict()
output:
特征选择
- 原因:
- 冗余:部分特征的相关度高,容易消耗计算性能
- 噪声:部分特征对预测结果有负影响
##什么是特征选择
- 特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,
- 特征在选择前和选择后可以改变值、也可以不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征
- 主要方法(三大武器):Filter(过滤式):VarianceThreshold, Embedded(嵌入式):正则化、决策树,Wrapper(包裹式)
sklearn特征选择API
-
类:sklearn.feature_selection.VarianceThreshold
-
导包:
from sklearn.feature_selection import VarianceThreshold
VarianceThreshold语法
VarianceThreshold(threshold=0.0)
删除多有低方差特征
VarianceThreshold.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,
即删除所有样本中具有相同值的特征。
VarianceThreshold流程
- 1、初始化VarianceThreshold,指定阀值方差
- 2、调用fit_transform
代码:
from sklearn.feature_selection import VarianceThreshold
def dict():
dict=VarianceThreshold(threshold=0.01)#删除所有低方差(0.1)特征
data=dict.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)
if __name__ == '__main__':
dict()
output:
sklearn降维API
-
类:sklearn.decompostion
-
导包
from sklearn.decompostion import PCA
import numpy as np
什么是PCA
- 本质:PCA是一种分析,简化数据集的技术
- 目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息
- 作用:可以削减回归分析或者聚类分析中特征的数量
###PCA语法
PCA(n_compoents=None)
将数据分解为较低维数空间
PCA.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
###PCA流程 - 初始化PCA,指定减少的维度
- 调用fit_transform
代码:
#机器学习基础from sklearn.decomposition import PCA
def dict():
dict=PCA(n_components=2)#初始化 实例化PCA,指定减少到多少维数
data=dict.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
if __name__ == '__main__':
dict()
output:
- 算法是核心,数据和计算是基础
- 找准定位
- 分析很多的数据
- 分析具体的业务
- 应用常见的算法
- 特征工程、调参数、优化
##机器学习开发流程
机器学习模型是什么
- 定义:通过一种映射关系将输入值到输出值
机器学习算法
- 监督学习
- 分类 k-近邻算法、贝叶斯分类、决策树与
- 随机森林、逻辑回归、神经网络
- 回归 线性回归、岭回归
- 标注 隐马尔可夫模型
- 无监督学习
- 聚类 k-means
-
监督学习
监督学习(英语:Supervised learning),可以由输入数据中学
到或建立一个模型,并依此模式推测新的结果。输入数据是由
输入特征值和目标值所组成。函数的输出可以是一个连续的值
(称为回归),或是输出是有限个离散值(称作分类)。 -
无监督学习
无监督学习(英语:Supervised learning),可以由输入数据中
学到或建立一个模型,并依此模式推测新的结果。输入数据是
由输入特征值所组成。
分类问题
-
概念:
分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果;
回归问题
-
概念:
回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。