一、前言
二、正文
Ⅰ.分类特征重新编码
①分类特征
②离散特征
③多标签类别编码
Ⅱ.数值特征重新编码
①多项式
②多个变量的多项式特征
Ⅲ.文本数据的特征构建
①文本词频条形图
②词袋模型
③TF-IDF矩阵
三、结语
特征工程中的特征构建的主要目的是生成新的特征,而针对不同的特征,有多种方式可以形成新的特征,例如有针对分类特征、针对数值特征和针对文本特征对其进行生成新的特征。
from sklearn import preprocessing
import pandas as pd
import numpy as np
Iris=pd.read_csv(r'C:\Users\asuspc\Desktop\program\data\chap2\Iris.csv')
np.random.seed(12)
label=np.random.choice(Iris.Species.values,size=4,replace=False)
label=label.reshape(-1,1)
OrdE=preprocessing.OrdinalEncoder()
label_OrdE=OrdE.fit_transform(label)
使用sklearn中的preprocessing模块来完成。针对类别标签,常用的方法是将其编码为序列号,preprocessing中的OridinalEncoder()来帮助我们完成。我们读取数据使用read_csv方法,接着用random中的choice方法,选取要编码的数据,Iris.Species.values则为数组的形式将所有类别按照一维的形式展现;label=label.reshape(-1,1)则是将其转化为二维数组,且按照一列的形式排列。OrdE=preprocessing.OrdinalEncoder()接着提取模块的方法方便使用;最后再执行这个语句,如下:label_OrdE=OrdE.fit_transform(label),以编码的方法对label类别的数据进行归一化。
此时我们已经成功将类别进行编码,根据结果可以看出,setosa被编码为0,versicolor被编码为1,virginica被编码为2。
le=preprocessing.LabelEncoder()
label_le=le.fit_transform([1,2,3,10,10])
print("0~n-1的整数:\n",label_le)
OneHotE=preprocessing.OneHotEncoder()
label_OneHotE=OneHotE.fit_transform(label)
print('OneHot编码:\n',label_OneHotE)
离散特征可以使用两种方式,一种是preprocessing模块中的LabelEncoder和preprocessing模块中的OneHotEncoder方法。
从输出中我们可以发现LabelEncoder方法使用之后,我们将数组变成了[0,1,2,3,3],而对label变量进行OneHotEncoder的方法,我们可以发现它只是给出了数值1所在矩阵的位置(也就是索引),那么输出来一个n*3的矩阵应该就是这样:
array([[1., 0., 0.],
[0., 0., 1.],
[1., 0., 0.],
[0., 1., 0.]])
就能够得到三个类别标签。
lb=preprocessing.LabelBinarizer()
label_lb=lb.fit_transform(label)
print("one vs all:\n",label_lb)
#输出结果:
one vs all:
[[1 0 0]
[0 0 1]
[1 0 0]
[0 1 0]]
那么还有一种办法就是二值化,由于方法类似而且 输出出来的结果与OneHotEncoder的方法相同,这里不过多赘述。
mle=preprocessing.MultiLabelBinarizer()
label_mle=mle.fit_transform([('A','B'),('B','C'),('D')])
print("Various categreory:\n",label_mle)
使用的方法如上,将方法提取再使用。
这里多类别是在说:总类别的类别个数取决于列数,然后每一行的类别出现应用索引的方法将每行按二值表示出来。
X=np.arange(1,5).reshape(-1,1)
ployF=preprocessing.PolynomialFeatures(degree=3,include_bias=False)
ployFX=ployF.fit_transform(X)
#输出结果
X:
array([[1],
[2],
[3],
[4]])
ployFX:
array([[ 1., 1., 1.],
[ 2., 4., 8.],
[ 3., 9., 27.],
[ 4., 16., 64.]])
针对单个变量x的多项式特征,通常使用幂运算得到[x^1,x^2,x^3......],如上给出了方法
interaction_only: 默认为False,字面意思就是只能交叉相乘,不能有a^2这种.
include_bias: 默认为True, 这个bias指的是多项式会自动包含1,设为False就没这个1了
X2=np.arange(1,11).reshape(-1,2)
ployFm=preprocessing.PolynomialFeatures(degree=2,interaction_only=False,include_bias=False)
ployFXm=ployFm.fit_transform(X2)
#输出结果
X2:
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
ployFXm: a b a^2 a*b b^2
array([[ 1., 2., 1., 2., 4.],
[ 3., 4., 9., 12., 16.],
[ 5., 6., 25., 30., 36.],
[ 7., 8., 49., 56., 64.],
[ 9., 10., 81., 90., 100.]])
通过特征的平方组成新特征,同样使用 PolynomialFeatures方法来完成。针对两个变量[a,b]生成多项式特征,并制定幂为2。
interaction_only: 默认为False,字面意思就是只能交叉相乘,不能有a^2这种.
include_bias: 默认为True, 这个bias指的是多项式会自动包含1,设为False就没这个1了
文本数据作为一种非结构化的数据在机器学习的应用当中也经常出现。例如:对新闻的类型进行分类,以及判读邮件是否为垃圾信息,这些都是对文本进行学习的方法,但是算法并不能理解文字的意思,因此需要使用相应的数据特征对文本数据进行表示。文本数据通常是词频特征、TF-ID矩阵等。
textdf=pd.read_table(r'C:\Users\asuspc\Desktop\program\data\chap3\文本数据.txt')
print(textdf)
#输出结果
text
0 I come from China.
1 My maijor is math.
2 Life is short, I use Python.
3 Python is a programming language.
4 Python, R and Matlab, I love Python.
5 My maijor is computer. He maijor is computer t...
6 I come from Shanghai China.
7 Life is short and happy in time.
获取得到文本数据,将文本数据进行打印。
import re
textdf['text']=textdf.text.apply(lambda x: x.lower())
textdf['text']=textdf.text.apply(lambda x: re.sub('[^\w\s]','',x))
print(textdf['text'])
#输出结果
0 i come from china
1 my maijor is math
2 life is short i use python
3 python is a programming language
4 python r and matlab i love python
5 my maijor is computer he maijor is computer te...
6 i come from shanghai china
7 life is short and happy in time
获取文本数据之后对文本进行预处理,保留有用的文本数据,剔除不必要的内容,且对数据内容进行大小写转换。
import matplotlib.pyplot as plt
text="".join(textdf.text)
text=text.split(" ")
textfre=pd.Series(text).value_counts()
textfre.plot(kind='bar',figsize=(10,6),rot=90)
plt.ylabel('word')
plt.xlabel('frequency')
plt.show()
先对字符串进行拼接,将每一行的单词都拼接在一块,然后用逗号对每一个单词进行分隔开放到一个列表当中。之后对一整个列表的单词分类计数textfre=pd.Series(text).value_counts()。
接着在计数表的基础上画出条形统计图即可。
从图中我们就能够分析出在这段文本里头的词频。可以发现is的出现次数对于这个文本来说是占据主导的地位的。
针对一条文本,我们可以词袋模型生成一个向量,该向量可以用来表示文本的特征,因此多个文本内容可以使用一个矩阵来表示,二词袋模型是文本表示常用的模型,该模型只关注文档中是否出现给定的单词和单词出现的频率,舍弃了文本的结构,单词出现的顺序和位置的信息。
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
cv=CountVectorizer(stop_words='english')
cv_matrix=cv.fit_transform(textdf.text)
cv_matrixdf=pd.DataFrame(data=cv_matrix.toarray(),columns=cv.get_feature_names_out())
print(cv_matrixdf)
#输出结果
china come computer happy language life love ... programming python shanghai short technology time use
0 1 1 0 0 0 0 0 ... 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0
2 0 0 0 0 0 1 0 ... 0 1 0 1 0 0 1
3 0 0 0 0 1 0 0 ... 1 1 0 0 0 0 0
4 0 0 0 0 0 0 1 ... 0 2 0 0 0 0 0
5 0 0 2 0 0 0 0 ... 0 0 0 0 1 0 0
6 1 1 0 0 0 0 0 ... 0 0 1 0 0 0 0
7 0 0 0 1 0 1 0 ... 0 0 0 1 0 1 0
[8 rows x 17 columns]
针对得到的矩阵可以根据不同的分析目的使用不同的分析方法。例如要知道每个样本之间的相关性,则利用上面的矩阵计算文本之间的余弦相似性。
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
textcosine=cosine_similarity(cv_matrixdf)
plt.figure(figsize=(8,6))
ax=sns.heatmap(textcosine,fmt='0.2f',annot=True,cmap='YlGnBu')
plt.show()
从sklearn库中找到模块有余弦相似性的方法然后将矩阵放到方法当中则会自动生成余弦相似性,然后通过热力图可视化体现出数据之间相似性的关系。
从图中可以发现文本0和文本6的相似性是最大的。
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
TFI=TfidfVectorizer(stop_words='english')
TFI_mat=TFI.fit_transform(textdf.text).toarray()
textcosine2=cosine_similarity(TFI_mat)
plt.figure(figsize=(8,6))
ax=sns.heatmap(textcosine2,fmt='0.2f',annot=True,cmap='YlGnBu')
plt.show()
针对改数据华科仪计算文本数据的文档一词项TF-IDF矩阵,这是用于信息检索与数据挖掘的技术,经常用于评估一个词项对于一个文件集或者一个语料库中的一份文件的重要程度。此的重要性随着他的出现次数成正比增加,但会随着他在语料库中出现的频率成反比下降。
从文中依然可以发现是文本0和文本6的相似性最大。
特征构建到此就结束了,希望对你能够有所帮助,点赞收藏起来以备不时之需吧。