特征工程是将数据(特征)处理,使得特征在机器学习上发挥更好的作用的方法。
特征抽取/特征提取:(文本类型 -> 数值 类型 -> 数值)
机器学习算法 - 统计方法 - 数学公式
pandas(库)主要用于数据清洗、数据处理
特征工程主要使用的是sklearn(库)
1.特征提取
1.1字典特征提取 - 类别 -> one-hot编码(sparse矩阵)
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
vector 数学:向量 物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组
父类:转换器类
返回sparse矩阵
sparse稀疏
将非零值 按位置表示出来
节省内存 - 提高加载效率
应用场景:
1)pclass, sex 数据集当中类别特征比较多
1、将数据集的特征-》字典类型
2、DictVectorizer转换
2)本身拿到的数据就是字典类型
代码
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=True)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray(), type(data_new))
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
dict_demo()
1.2文本特征抽取
单词 作为 特征
特征:特征词
方法1:CountVectorizer
统计每个样本特征词出现的个数
stop_words停用的
停用词表
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
方法2:TfidfVectorizer(更常用、更准确)
TF-IDF - 重要程度
举例对比:
两个词 “经济”,“非常”
1000篇文章-语料库
100篇文章 - "非常"
10篇文章 - “经济”
两篇文章
文章A(100词) : 10次“经济” TF-IDF:tf*idf=0.2
tf:10/100 = 0.1
idf:lg 1000/10 = 2
文章B(100词) : 10次“非常” TF-IDF:tf*idf=0.1
tf:10/100 = 0.1
idf: log 10 1000/100 = 1
TF - 词频(term frequency,tf)
IDF - 逆向文档频率
代码一(CountVectorizer)
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
def count_demo():
"""
文本特征抽取:CountVecotrizer
:return:
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words=["is", "too"])
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
count_demo()
代码二(TfidfVectorizer)(中文需要先分词)
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def cut_word(text):
"""
进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
:param text:
:return:
"""
return " ".join(list(jieba.cut(text)))
def tfidf_demo():
"""
用TF-IDF的方法进行文本特征抽取
:return:
"""
# 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 1、实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["一种", "所以"])
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
tfidf_demo()
2.特征预处理(无量纲化)
2.1归一化(把原始数据映射到一个小区间内,默认为[0,1],防止某些小范围特征被忽略)
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
def minmax_demo():
"""
归一化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = MinMaxScaler(feature_range=[2, 3])
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
minmax_demo()
2.2标准化(把原数据变换到均值为0,标准差为1的范围内,减少异常值的影响,适用于数据量大的情况)
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
def stand_demo():
"""
标准化
:return:
"""
# 1、获取数据
data = pd.read_csv("dating.txt")
#取特定范围的值(行和列)
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = StandardScaler()
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
stand_demo()
3.特征降维(减少特征的个数)
3.1特征选择,又称过滤低方差特征(去除对目标值影响很小的特征值)
代码(过滤低方差特征+特征之间的相关系数)
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import pandas as pd
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 1、获取数据
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
print("data:\n", data)
# 2、实例化一个转换器类
transfer = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)
return None
if __name__ == "__main__":
variance_demo()
3.2主成分分析(PCA降维,保留主要特征)
from sklearn.decomposition import PCA
def pca_demo():
"""
PCA降维
:return:
"""
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
transfer = PCA(n_components=0.95)
# n_components=0.95 表示保留95%的信息
# n_components=2 表示保留2个主要特征
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
pca_demo()
附上思维导图: