1.数据集
1.1 训练数据
用于训练,构建模型。
1.2 测试数据
在模型检验时使用,用于评估模型是否有效。
1.3 数据集划分
API:sklearn.model_selection.train_test_split(),特征值代表数据的特征,目标值代表想要的分类结果。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
#获取数据集
iris = load_iris()
print("鸢尾花数据集:\n",iris)
print("查看数据集描述:\n",iris["DESCR"])
print("查看特征值的名字:\n",iris.feature_names)
print("查看特征值:\n",iris.data)
print("查看特征值形状:\n",iris.data.shape)
#数据集的划分
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
print("训练集的特征值:\n",x_train,x_train.shape)
print("测试集的特征值:\n",x_test,x_test.shape)
return None
if __name__ == "__main__":
datasets_demo()
这里定义训练集的特征值(x_train),测试集的特征值(x_test),训练集的目标值(y_train),测试集的目标值(y_test)
2.特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。特征工程包括特征提取、特征预处理和特征降维三个部分。
2.1 特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征。
特征提取API:sklearn.feature_extraction
2.1.1字典特征提取(特征离散化)
字典特征提取API:sklearn.feature_extraction.DictVectorizer(sparse=True,…),sparse默认为True,提取结果为稀疏矩阵(只描述非零点的位置)-节省内存
示例代码如下:
from sklearn.feature_extraction import DictVectorizer
def dict_feature():
"""
字典特征提取DictVectorizer()
:return:
"""
data = [{"city": "北京", "temperature": 100},
{"city": "上海", "temperature": 60},
{"city": "深圳", "temperature": 30}]
# 1.实例化一个转换器
transfer = DictVectorizer(sparse=False) # sparse默认为True,提取结果为稀疏矩阵(只描述非零点的位置)-节省内存
# 2.调用fit_transform()
result = transfer.fit_transform(data)
print("特征名:", transfer.get_feature_names())
print("提取结果为:\n", result)
if __name__ == "__main__":
dict_feature()
运行结果如下图:
2.1.2文本特征提取
文本特征提取API:sklearn.feature_extraction.text
文本特征提取方法一
API:sklearn.feature_extraction.text.CountVectorizer(stop_words=[]),返回词频矩阵,即每个单词出现的次数;stop_words表示停用词,即不对这些词进行统计。
(1)英文文本特征提取
代码如下:
from sklearn.feature_extraction.text import CountVectorizer
def text_feature():
"""
英文特征提取CountVectorizer()
:return:
"""
data = ["life is short, i like like python", "life is too long, i dislike python"]
transfer = CountVectorizer()
result = transfer.fit_transform(data)
print("特征名:", transfer.get_feature_names())
print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
text_feature()
运行结果如下:
(1)中文文本特征提取——采用jieba分词
代码如下:
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def count_chinese_feature():
"""
中文特征提取,自动分词
:return:
"""
data = ["十月中旬,好不容易遇着一次休养的机会。",
"舒展一下筋骨,顺便先欣赏一下风光。",
"当晚我九点时就迷迷糊糊睡着了,不知过了多久却突然醒来。"]
data_new = []
for i in data:
cut_result = " ".join(list(jieba.cut(i)))
data_new.append(cut_result)
transfer = CountVectorizer(stop_words=["20", "索性", "好不容易"])
result = transfer.fit_transform(data_new)
print("特征名:\n", transfer.get_feature_names())
print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
count_chinese_feature()
运行结果如下:
文本特征提取方法二
API:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
TF:即词频(term frequency),指的是一个给定的词语在该文件中出现的频率。
IDF:即逆向文档频率(inverse document frequency),指的是一个词语的普遍重要性。某一特定词语的IDF可以由总文件数目除以包含该词语文件的数目,再将得到的商取以10为底的对数得到。
TFIDFi,j=TFi,j × IDFi,j
TFIDF方法中文文本特征提取——采用jieba分词
代码如下:
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_feature():
"""
用Tfidf的方法进行文本特征提取,衡量一个词的重要程度,即词频
:return:
"""
data = ["十月中旬,好不容易遇着一次休养的机会。",
"舒展一下筋骨,顺便先欣赏一下风光。",
"当晚我九点时就迷迷糊糊睡着了,不知过了多久却突然醒来。"]
data_new = []
for i in data:
cut_result = " ".join(list(jieba.cut(i)))
data_new.append(cut_result)
transfer = TfidfVectorizer(stop_words=["20", "索性", "好不容易"])
result = transfer.fit_transform(data_new)
print("特征名:\n", transfer.get_feature_names())
print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
tfidf_feature()
运行结果如下:
2.2 特征预处理
特征预处理就是通过一些转化函数将特征数据转换成更加适合算法模型的特征数据过程。(无量纲化)
特征预处理API:sklearn.preprocessing
2.2.1 归一化
定义:通过对原始数据进行变换把数据映射到指定区间(默认为[0,1])之间。
公式:X’=(X-min)/(max-min) X’‘=X’*(mx-mi)+mi ,其中max为一列的最大值,min为一列的最小值,X’'为最终结果,mx和mi分别为指定区间的上限和下限。
API:sklearn.preprocessing.MinMaxScaler(feature_range(0,1),…)
示例代码如下:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_scaler():
"""
归一化
:return:
"""
# 1.获取数据
data = pd.read_csv("dating1.txt")
# print(data)
data = data.iloc[:, :3]
print("处理之前的数据:\n%s" % data)
# 2.实例化一个转换器
transfer = MinMaxScaler(feature_range=(1, 3))
# 3.调用fit_transform()
data_new = transfer.fit_transform(data)
print("归一化后的数据:\n%s" % data_new)
if __name__ == "__main__":
minmax_scaler()
运行结果如下:
归一化总结:由于指定区间是变化的,所以数据处理的稳定性较差,只适合传统精确小数据。
2.2.2 标准化
定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内。
公式:X’=(X-mean)/σ,其中mean为平均值,σ为标准差。
API:sklearn.preprocessing.StandardScaler()
示例代码如下:
# 标准化
import pandas as pd
from sklearn.preprocessing import StandardScaler
def standard_scaler():
"""
标准化
:return:
"""
# 1.获取数据
data = pd.read_csv("dating1.txt")
# print(data)
data = data.iloc[:, :3]
print("处理之前的数据:\n%s" % data)
# 2.实例化一个转换器
transfer = StandardScaler()
# 3.调用fit_transform()
data_new = transfer.fit_transform(data)
print("标准化后的数据:\n%s" % data_new)
if __name__ == "__main__":
standard_scaler()
运行结果如下:
标准化总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据环境。
2.3 特征降维
降维是指在某些特定条件下,降低随机变量(特征)的个数,得到一组“不相关”的主变量(特征)的过程。特征降维主要有特征选择和主成分分析(可以理解为一种特征提取的方式)两种方法。
2.3.1特征选择
定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
方法:(1)Filter(过滤式)—— 主要探究特征本身特点、特征与特征和目标值之间关联,包括方差选择法(低方差特征过滤)和相关系数两种方法;(2)Embedded(嵌入式)—— 算法自动选择特征,主要考虑特征与目标值之间的关联,包括决策树(信息熵、信息增益)、正则化(L1,L2)、深度学习(卷积等)三种方法。
方差选择法(低方差特征过滤)
API:sklearn.feature_selection.Variance.Threshold(threshold=0.0)
返回值:训练集差异低于threshold的特征将被删除,默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
示例代码:
# 方差选择法(低方差特征过滤)
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
方差选择法(低方差特征过滤)
:return:
"""
# 1.获取数据
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
# 2.实例化转换器类
variance = VarianceThreshold()
# 3.调用fit_transform()
data_new = variance.fit_transform(data)
print("低方差特征过滤后的数据:\n%s" % data_new)
if __name__ == "__main__":
variance_demo()
运行结果:
相关系数方法(皮尔逊相关系数)
API:from scipy.stats import pearsonr,传入参数x,y,x和y为需要对比的两个特征。
示例代码:
# 相关系数方法(皮尔逊相关系数)
import pandas as pd
from scipy.stats import pearsonr
def variance_demo1():
"""
相关系数方法(皮尔逊相关系数)
:return:
"""
# 1.获取数据
data = pd.read_csv("factor_returns.csv")
data = data.iloc[:, 1:-2]
# 2.计算相关系数
r = pearsonr(data["pb_ratio"], data["market_cap"])
print("pb_ratio和market_cap的相关系数为:\n", r)
if __name__ == "__main__":
variance_demo1()
运行结果如下:
总结:如果特征与特征之间相关性很高,可以选择其中一个加入到主变量,或者将两个特征加权求和形成一个新的特征。
2.3.2主成分分析(PCA)
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量,尽量使损失最小。
API:sklearn.decomposition.PCA(n_components=None),n_components为小数时表示保留百分之多少的信息,为整数时表示保留多少特征。
示例代码:
from sklearn.decomposition import PCA
def PCA_demo():
"""
PCA降维
:return:
"""
data = [[1, 2, 5, 6],
[5, 6, 7, 6],
[5, 5, 2, 5],
[5, 5, 5, 6]]
# 1.实例化一个转换器
transfer = PCA(n_components=0.75)
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
print("转换前的数据", data)
print("转换后的数据", data_new)
if __name__ == "__main__":
PCA_demo()
运行结果如下:
2.3.3 降维案例(探究用户对物品类别喜好)
(1)需要将用户ID和物品类别放到同一张表中——合并
(2)找到用户ID和物品类别之间的关系——交叉表和透视表
(3)特征冗余——降维
示例代码:
import pandas as pd
from sklearn.decomposition import PCA
def PCA_example():
"""
降维案例:探究用户对商品类别喜好
:return:
"""
# 1.获取数据
orders = pd.read_csv("./orders.csv")
aisles = pd.read_csv("./aisles.csv")
products = pd.read_csv("./products.csv")
order_products = pd.read_csv("./order_products__prior.csv")
# 2.合并表
tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"]) # 合并aisles和products
# print(tab1)
tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"]) # 合并tab1和order_products
tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"]) # 合并tab2和orders
# 3.找到user_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
data = table[:10000]
# 4.PCA降维
transfer = PCA(n_components=0.75) # 实例化一个转换器
data_new = transfer.fit_transform(data) # 调用fit_transform
print("降维前的数据", data.shape)
print("降维后的数据", data_new.shape)
if __name__ == "__main__":
PCA_example()
运行结果如下: