特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
更好的特征意味着更强的鲁棒性
更好的特征意味着只需用简单模型
更好的特征意味着更好的结果
Python语言的机器学习工具
Scikit-learn包括许多知名的机器学习算法的实现
基于NumPy、SciPy和matplotlib构建
开源、商业可用 - BSD许可
Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。
特征抽取:将任意数据格式(例如文本和图像)转换为机器学习的数字特征。
特征抽取针对非连续型数据
特征抽取对文本等进行特征值化
特征值化是为了计算机更好的去理解数据
sklearn.feature_extraction
定义:将字典中的一些类别数据,分别进行转换成特征
作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
分类特征变量/字典提取语法:
sklearn.feature_extraction.DictVectorizer(sparse = True)----将映射列表转换为Numpy数组或scipy.sparse矩阵
sparse :是否转换为scipy.sparse矩阵表示,默认开启
方法:
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器----返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵----返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
from sklearn.feature_extraction import DictVectorizer
def dictver():
"""字典数据抽取"""
dict = DictVectorizer()
data = dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
print(data)
print(dict.get_feature_names())
print(data.toarray()) # 转化为数组
print(dict.inverse_transform(data))
if __name__ == '__main__':
dictver()
结果为:
作用:对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
语法:
sklearn.feature_extraction.text.CountVectorizer()----将文本文档的集合转换为计数矩阵
方法:
CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象----返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵----返回值:转换之前数据格式
CountVectorizer.get_feature_names()
返回值:单词列表
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()) # 对每篇文章,在词的列表里面进行统计每个词出现的次数
if __name__ == '__main__':
countvec()
from sklearn.feature_extraction.text import CountVectorizer
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 zwvec():
"""对中文文本的特征值化"""
c1,c2,c3 = cutword()
cv = CountVectorizer()
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
zwvec()
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
语法:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,…)-----返回词的权重矩阵
方法:
TfidfVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象-----返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵------返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
返回值:单词列表
from sklearn.feature_extraction.text import 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()
tf = TfidfVectorizer()
data = tf.fit_transform([c1,c2,c3])
print(tf.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
tfidfvec()
分类机器学习算法的的重要依据
特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
数值型数据:
标准缩放:1.归一化 2.标准化
3.缺失值
类别型数据:one-hot编码
时间类型:时间的切分
sklearn. preprocessing
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx、mi分别为指定区间值默认mx为1,mi为0
sklearn归一化API: sklearn.preprocessing.MinMaxScaler
语法:
sklearn.preprocessing.MinMaxScalar(feature_range=(0,1)…)------每个特征缩放到给定范围(默认[0,1])
方法:
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
注意:在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
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)
if __name__ == '__main__':
mm()
特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
公式:
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn标准化API: scikit-learn.preprocessing.StandardScaler
语法:
scikit-learn.preprocessing.StandardScaler
处理之后每列来说所有数据都聚集在均值0附近方差为1
方法:
StandardScaler.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
StandardScaler.mean
原始数据中每列特征的平均值
from sklearn.preprocessing import StandardScaler
def stand():
"""标准化缩放"""
std = StandardScaler()
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
print(std.mean_)
if __name__ == '__main__':
stand()
结果为:
在已有样本足够多的情况下比较稳定,标准化适合现代嘈杂大数据场景。
缺失值处理方法:
删除—如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
插补—可以通过缺失值每行或者每列的平均值、中位数来填充
sklearn缺失值API: sklearn.Imputer.SimpleImputer
语法:
SimpleImputer(missing_values=np.nan, strategy=‘mean’)
完成完成缺失值插补
方法:
SimpleImpute.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
from sklearn.impute import SimpleImputer
import numpy as np
def sim():
"""缺失值处理"""
im = SimpleImputer(missing_values=np.nan,strategy='mean')
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
if __name__ == '__main__':
sim()
维度:特征的数量
特征选择:是在已有的特征中选择更好的特征。
特征选择原因:
冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有负影响
sklearn特征选择API:klearn.feature_selection.VarianceThreshold
语法:
klearn.feature_selection.VarianceThreshold(threshold = 0.0)----删除所有低方差特征
方法:
Variance.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
def var():
"""特征选择---删除低方差数据"""
vart = VarianceThreshold()
data = vart.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
if __name__ == '__main__':
var()
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
注意:高维度数据容易出现的问题—特征之间通常是线性相关的
PCA的API:sklearn.decomposition.PCA
语法:sklearn.decomposition.PCA(n_components=None)----将数据分解为较低维数空间
n_components:一般在0.9-0.95之间
方法:
PCA.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
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)
if __name__ == '__main__':
pca()
结果为:
1.获取数据
数据来源:https://www.kaggle.com/c/instacart-market-basket-analysis/data
数据:
products.csv 商品信息
order_products__prior.csv 订单与商品信息
orders.csv 用户的订单信息
aisles.csv 商品所属具体物品类别
2.数据处理
2.1 合并表格
通过网站中的数据描述可知:
表一:order_products__prior.csv:订单与商品信息
字段:order_id, product_id
表二:products.csv:商品信息
字段:product_id, aisle_id
表三:orders.csv:用户的订单信息
字段:order_id,user_id
表四:aisles.csv:商品所属具体物品类别
字段: aisle_id, aisle
合并过程:
表一与表二通过相同字段(特征)product_id进行合并,合并后的表再与表三通过相同字段order_id进行合并,最后表一二三合并后的表与表四通过相同字段aisle_id合并为一张表
2.2 交叉表(特殊的分组工具)
pd.pd.crosstab(指定的行,指定的列)
2.3 主成分分析
import pandas as pd
from sklearn.decomposition import PCA
# 读取四张表的数据----数据与.py文件在同一目录下
prior = pd.read_csv("order_products__prior.csv")
products = pd.read_csv("products.csv")
orders = pd.read_csv("orders.csv")
aisles = pd.read_csv("aisles.csv")
# 合并为一张表
mt = pd.merge(prior,products,on=['product_id','product_id'])
mt = pd.merge(mt,orders,on=['order_id','order_id'])
mt = pd.merge(mt,aisles,on=['aisle_id','aisle_id'])
# 交叉表(特殊的分组工具)
cross = pd.crosstab(mt['user_id'],mt['aisle'])
# 主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data)