1.sklearn数据集
sklearn.datasets
datasets.load_*() 获取小规模的数据集
datasets.fetch_*(data_home=None) 获取大规模数据集 函数的第一个参数是data_home,标识数据集下载目录,默认/scikit_learn_data/
1.1sklearn小数据集
sklearn.datasets.load_iris()
1.2sklearn大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None)
1.3数据集的返回值
datasets.base.Bunch(继承自字典)
disk["ket"] = values
bunch.key = valuse
from sklearn.datasets import load_iris
def datasets_demo():
"""
sklearn数据集使用
:return:
"""
#获取数据集
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("查看数数据集描述:\n",iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值:\n", iris.data, iris.data.shape)
return None
if __name__ == "__main__":
#sklearn数据集的使用
datasets_demo()
data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarry数组
target:标签数组,是n_samples的一维numpy.ndarry数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名
1.4.数据集的划分
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
测试集 20%~30%
数据集划分api:
sklearn.model_selection.train_test_split(arrays, *options)
x 数据集的特征值
y 数据集的标签值
test_size测试集的大小,一般为float
random_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
return训练集特征值,测试集特征值,训练集目标值,测试集目标值
return x_train, x_test, y_train, y_test
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, train_size = 0.2, random_state = 22)
print("训练集的特征值:\n",x_test,x_test.shape)
2.特征工程介绍
算法 特征工程
pandas 数据清洗,数据处理
sklearn 特征工程
2.1特征抽取/特征提取
sklearn.feature_extraction
机器学习算法 - 统计方法 - 数学公式
文本类型 - > 数值
将任意数据(文本或土象)转换为可用于机器学习的数字特征
字典特征提取(特征离散化)
文本特征提取
图像特征提取(深度学习再介绍)
2.1.1字典特征提取
字典特征提取 - 类别 -> one -hot编码
作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True, …)
vector 数学:向量 物理:矢量
矩阵 matrix 二位数字
向量 vector 一维数组
父类:转换器类
返回sparse矩阵(sparse稀疏)将非零值 按位置表示出来
节省内存 提高加载效率
DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵
DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names_out():返回类别名称(新版)
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{'city':'北京', 'temperature':100},
{'city':'上海', 'temperature':60},
{'city':'深圳', 'temperature':30}]
# 1.实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names_out())
return None
if __name__ == "__main__":
# 代码2:字典特征抽取
dict_demo()
2.1.2字典提取应用场景:
1.pclass,sex 数据集当中类别特征比较多
1.将数据集的特征 -> 字典类型
2.DictVectorizer转换
2。本身拿到的数据就是字典类型
2.2文本特征提取
单词作为特征
句子,短语,单词,字母
特征:特征词
方法1:CountVectorizer 统计样本特征词出现的个数
stop_words停用的
关键词:在某一个类别的文章出现的次数很多,但是在其他类别的文章出现的次数少
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):返回词频矩阵
CountVectorizer.fit_transform(X),X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X),X:array数组或者sparse矩阵,返回值:转换之前数据格
CountVectorizer.get_feature_names_out():返回值:单词列表
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
"""
文本特征抽取:CountVectorizer
:return:
"""
data = ['life is short,i like like python',
'life is too long,i dislike python']
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
if __name__ == "__main__":
#代码3: 文本的特征抽取:CountVectorizer
count_demo()
中文:不支持单个中字
def count_chinese_demo():
"""
中文文本特征抽取:CountVectorizer
:return:
"""
data = ['我 爱 北京 天安门',
'天安门 上 太阳 升']
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
if __name__ == "__main__":
# 代码4: 中文文本特征抽取:CountVectorizer
count_chinese_demo()
中字分割
def cut_word(text):
"""
进行中文分词:”我爱北京天安门“->”我 爱 北京 天安门“
:param text:
:return:
"""
return " ".join(list(jieba.cut(text)))
def count_chinese_demo2():
"""
中文本特征抽取,自动分词
:return:
"""
# 1.将中文文本进行分词
data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
'如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、实例化一个转换器类
transfer = CountVectorizer()
# 3、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
if __name__ == "__main__":
#代码5 中文本特征抽取,自动分词
count_chinese_demo2()
# 代码6:中文分词
# print(cut_word("我爱北京天安门"))
方法2.TfidfVectorizer
Tf-idf - 衡量一个词的重要程度
两个词 “经济” “肥肠”
TF - 词频(term fequency ,tf)
IDF - 逆向文档频率
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
def tfidf_demo():
"""
用TF-IDF的方法进行文本特征抽取
:return:
"""
data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
'如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["一种","所以"])
# 3、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
if __name__ == "__main__":
#代码7 用TF-IDF的方法进行文本特征抽取
tfidf_demo()
3.特征预处理
什么是特征预处理:通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程
为什么要进行归一化/标准化:特征的单位或者大小相差较大,或者某特征的方法相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
3.1归一化
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
MinMaxScaler.fit_transform(X),
X:numpy array格式的数据[n_samples,n_features],
返回值:转换后的形式相同的array
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归一化
:return:
"""
#1.获取数据
data = pd.read_csv("D:\PyCharm\heima\dating.txt")
# print("data:\n", data)
data = data.iloc[:,:3]
print("data:\n", data)
#2.实例化一个转换器类
transfer = MinMaxScaler()
#3.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
minmax_demo()
结果
异常值:最大值或者最小值
注意最大值最小值是变化的,另外,最大值与最小值非常容易受到异常值影响,
所以这种方法鲁棒性较差,只适合传统精确小数据场景
3.2标准化
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,name结果显然会发生改变
- 对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响不大,从而方差改变较小
- 标准差:集中程度
- 应用场景:在已有样本足够多的情况下比较稳定。适合现代嘈杂大数据场景
sklearn.perprocessing.StandradScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X),
X;numpy array格式的数据[n_samples,n_features],
返回值:转化后的形状相同的array
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
标准化
:return:
"""
#1.获取数据
data = pd.read_csv("D:\PyCharm\heima\dating.txt")
# print("data:\n", data)
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()
4. 特征降维
ndarray
降低的对象是:二维数组。
降维就是在某些限定条件下,降低特征的个数,得到一组“不相关”主变量的过程
降维的两种方法:特征选择,主成分分析
4.1特征选择
定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征
Filter(过滤式):方差选择法:低方差特征过滤
相关系数法-特征与特征之间的相关程度
Embedded(嵌入式):决策树,
正则化,
深度学习
4.1.1过滤式
模块
sklearn.feature_selection
低方差特征过滤
删除低方差的一些特征
- 特征方差小:某个特征大多样本的值比较相近
- 特征方差大:某个特征很多样本的值都有差别
sklearn.feature_selection.VArianceThreshold(threshold=0.0)
删除所有低方差特征
Variance.fit_transform(X),
X:numpy array格式的数据[m_sample,n_features],
返回值:训练集差异低于threadshold的特征将被删除。默认值是保留非零方差特征,即删除所有样本中具有相同值的特征
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
低方差特征过滤
:return:
"""
# 1、获取数据
data = pd.read_csv('factor_returns.csv')
print('data:\n', data)
data = data.iloc[:,1:-2]
print('data:\n', data)
# 2、实例化一个转换器类
#transform = VarianceThreshold()
transform = VarianceThreshold(threshold=5)
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new, data_new.shape)
return None
if __name__ == "__main__":
#过滤低方差特征
variance_demo()
4.1.2相关系数
皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标
相关系数的值介于-1与+1之间,即-1<=r<=+1。其性质如下:
当r>0时,表示两变量正相关;r<0时,两变量为负相关
当|r|=1时,表示两变量为完全相关;当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近0,表示两变量的线性相关越弱
一般可按三级划分:|r|<0.4为低度相关;0.4<=|r|<0.7为显著相关;0.7<=|r|<1为高维线性相关
from scipy.stats import pearsonr
- x:(N.)array_like
- y:(N.)array_like Returns:(Perason’s correlation coefficient, p-value)
-
import pandas as pd from sklearn.feature_selection import VarianceThreshold from scipy.stats import pearsonr def variance_demo(): """ 低方差特征过滤 :return: """ # 1、获取数据 data = pd.read_csv('factor_returns.csv') print('data:\n', data) data = data.iloc[:,1:-2] print('data:\n', data) # 2、实例化一个转换器类 #transform = VarianceThreshold() transform = VarianceThreshold(threshold=5) # 3、调用fit_transform data_new = transform.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()
-
特征与特征之间相关性很高:
-
1选取其中一个
-
加权求和
-
主成分分析
-
4.1.3主成分分析
定义:高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息
应用:回归分析或者聚类分析中
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维度空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
PCA.fit_transform(X),X:numpy array格式的数据[N_samples, n_features],
返回值:转换后指定维度的array
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)
#2.调用了fit_transfer
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
#PCA降维
pca_demo()
保留95%
5.案例
探究用户对物品类别的喜好细分
用户 user_id
物品类别 aisle
1)需要将user_id和aisle放在同一表中
2)找到user_id和aisle关系 - 交叉表和透视表
3)特征冗余过多 -> PCA降维