目录
sklean特征预处理API——标准化——异常值的影响少一点
机器学习概述
什么是机器学习?
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
如:alpha狗,广告搜索
为什么需要机器学习?
- 解放生产力---智能客服
- 解决专业问题---ET医疗
- 提供社会便利---城市大脑
机器学习在各领域带来价值:(广告推荐)
让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。
数据集的结构
从历史数据当中获得规律?这些历史数据是什么格式?
机器学习的数据:文件csv
mysql:
- 性能瓶颈,读取速度受限
- 格式不太符合机器学习要求数据的格式
pandas:读取工具,基于numpy,读取速度很快
numpy:释放了GIL(🔒锁),达到真正的多线程
可用的数据集
Kaggle:Find Open Datasets and Machine Learning Projects | Kaggle
- 大数据竞赛平台
- 80万科学家
- 真实数据
- 数据量巨大
UCI:UCI Machine Learning Repository
- 收录了360个数据集
- 覆盖科学、生活、经济等领域
- 数据量几十万
scikit-learn:7. Dataset loading utilities — scikit-learn 1.0.2 documentation
- 数据量较小
- 方便学习
常用数据集数据的结构组成
特征值+目标值
预测房价:
前四列特征值,最后一列目标值
有些数据集可以没有目标值
数据的特征工程
pandas:一个读取数据非常方便以及基本的处理格式的工具
缺失值,数据转换,重复值不需要进行去重
sklearn:对于特征的处理提供了强大的接口
特征工程是什么?
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对位置数据的预测准确性
特征工程的意义
直接影响预测结果
Scikit-learn库介绍
- Python语言的机器学习工具
- Scikit-learn包括许多知名的机器学习算法的实现
- Scikit-learn文档完善,容易入手,丰富的API,使其在学术界颇受欢迎
- 目前稳定版本0.19
数据的特征抽取
特征抽取演示
['bu', 'de', 'fan', 'ge', 'neng', 'ni', 'sha', 'si', 'tian']
[[0 1 0 1 0 0 0 0 2]
[1 1 1 0 1 1 1 1 0]]
特征抽取是对文本等数据进行特征值化
特征值化是为了计算机更好的去理解数据
字典特征抽取
对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
DictVectorizer(sparse = True,...)
1、DictVectorizer.fit_transform(X) ——节约内存,方便读取处理
- X:字典或者包含字典的迭代器
- 返回值:返回sparse矩阵
2、DictVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
3、DictVectorizer.get_feature_names()
- 返回类别名称
4、DictVectorizer.transform(X)
- 按照原先的标准转换
sparse:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 50.0
# 二维数组 ndarray:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 50.]
[ 0. 0. 1. 10.]]
字典数据抽取:把字典中一些类别数据,分别进行转换成特征
数组形式,有类别的这些特征(先要转换成字典,再抽取)
one-hot编码:
利于我们进行数据分析和输入
文本特征抽取——tf * idf——考虑词的重要性
1、文本特征抽取:Count
对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer()——返回词频矩阵
1、CountVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
2、CountVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
3、CountVectorizer.get_feature_names()
- 返回值:单词列表
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
"""对文本进行特征值化
ireturn: None
"""
cv = CountVectorizer()
data = cv.fit_transform(['i like python','life is beautiful'])
print(data)
print(data.toarray())
print(cv.get_feature_names())
return None
if __name__ == "__main__":
countvec()
- 统计所有文章当中的词,重复的看作一次
- 对每篇文章,在词的列表里面进行统计每个词出现的次数
- 单个字母不统计
应用场景(前提是文本特征抽取):
- 文本分类
- 情感分析
对于单个英文字母(汉字)不统计:不能代表什么,没有分类的依据
只要把每个空格分开,就可以进行文本抽取,所以中文在抽取之前要进行分词
'人生 苦短,我 喜欢 python'
[ 'python', '人生', '喜欢', '苦短']
分词器:jieba
jieba.cut('我是一个程序员')
返回值:词语生成器
2、文本特征抽取:tf * idf——重要性
tf:tearm frequency:词的频率————出现的次数
idf:inverse document frequency:逆文档频率————log(总文档数量/该词出现的文档数)
log(数值):输入的数值越小,结果越小——出现的频率越高,越不重要
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer(stop_words = None,...)——返回词的权重矩阵
1、TfidfVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
2、TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
3、TfidfVectorizer.get_feature_names()
- 返回值:单词列表
分类机器学习算法的重要依据
数据的特征预处理
特征预处理是什么?
特征的预处理:对数据进行处理
通过特定的统计方法(数学方法)将数据转换成算法要求的数据
特定的统计方法
数值型数据(标准缩放):
- 归一化
- 标准化
- 缺失值
类别型数据:
- one-hot编码
时间类型:
- 时间的切分
sklean特征预处理API——标准化——异常值的影响少一点
sklearn.preprocesing
1、归一化————认为特征同等重要的时候
- 特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
- 公式: ,
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X''为最终结果,
mx,mi分别为指定区间值,默认mx为1,mi为0
sklearn.preprocesing.MinMaxScalar
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return:
"""
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform([[0, 1, 0, 100],[1, 0, 0, 50],[0, 0, 1, 10]])
print(data)
return None
if __name__ == "__main__":
mm()
如果数据中异常点较多,会有什么影响?
在特定场景下最大值最小值是变化的,而且,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
2、标准化
- 特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内
- 公式:
注:作用于每一列,mean为平均值,σ为标准差,var成为方差,n为每个特征的样本数
,
其中:方差(考察数据的稳定性)
- 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn.preprocesing.StandardScaler
from sklearn.preprocessing import StandardScaler
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[1,2,3,5],[2,3,4,3],[8,9,8,1]])
print(data)
return None
if __name__ == "__main__":
stand()
3、如何处理数据中的缺失值?
sklearn.imputer.SimpleImputer
from sklearn.impute import SimpleImputer
import numpy as np
def im():
"""
缺失值处理
:return:
"""
# NaN,nan
im = SimpleImputer(missing_values=np.nan,strategy='mean',verbose=0)
data = im.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__ == '__main__':
im()
通常用pandas处理。pandas:dropna,fillna。但同时要保证,数据当中的缺失值:np.nan。
replace('?',np.nan)
数据的降维
特征的数量减少
特征选择
1、什么是特征选择?
- 特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
- 主要方法(三大武器):Filter(过滤式):VarianceThreshold
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)
2、特征选择原因
- 冗余:部分特征相关度高,容易消耗计算性能——主成分分析?
- 噪声:部分特征对预测结果有影响
3、sklearn特征选择API
Filter(过滤式):VarianceThreshold————删除低方差的特征
方差大小:考虑所有样本这个特征的数据情况
sklearn.feature_selection.VarianceThreshold
4、其他特征选择方法
神经网络
PCA(主成分分析)——应用场景较少
sklearn.decomposition
1、PCA是什么?
- 本质:PCA是一种分析、简化数据集的技术
- 目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
- 作用:可以削减回归分析或者聚类分析中特征的数量。
特征数量达到上百的时候,要不要用PCA进行数据的简化?——数据改变,特征减少
2、高纬度特征之间容易出现的问题
特征之间通常是相关的
Y = P X
3、PCA语法
PCA( n_components = None)
- 将数据分解为较低维数空间
PCA.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
n_components:小数:0-1 90-95%(可人为控制主成分分析保留数据的量)
整数:减少到的特征数量
from sklearn.decomposition import PCA
def pca():
"""
主成分分析进行特征降维
:return:
"""
pca = PCA(n_components=0.95)
data = pca.fit_transform([[8,2,5,3],[0,1,4,3],[0,1,1,3]])
print(data)
return None
if __name__ == '__main__':
pca()
案例——探究:用户对物品类别的喜好细分降维
Instacart Market Basket Analysis | Kaggle
instacart:把用户分成几个类别——用户_购买的物品类别预测
数据:
- products.csv:商品信息
- order_products_prior.csv:订单与商品信息
- orders.csv:用户的订单信息
- aisles.csv:商品所属具体物品类别
(1)合并各张表到一张表当中——pd.merge()
(2)先把表读取出来,再按照相同的特征合并
(3)建立行、列_id——交叉表(特殊的分组表)
特征选择与主成分分析的比较?
几百数据的时候可以用主成分分析