sklearn数据集的使用
sklearn.datasets
- load_* 获取小规模数据集
- fetch_*获取大规模数据集
sklearn 小数据集
-
sklearn.datasets.load_iris() 获取鸢尾花数据集。
-
sklearn 数据集返回值介绍
- load 和fetch返回的数据类型datasets.base.Bunch(字典格式)
- data: 特征数据数组,是np.ndarray的二维数组
- target:标签数组,是np.ndarray的一维数组
- DESCR:数据描述
- feature_names:特征名
- target_name:标签名
-
获取内容
- 直接输出 iris
- 输入字段 iris[‘DESCR’]
- 输出属性,用.属性方式 iris.feature_names
- 查看字段名:iris.keys()
form sklearn.datasets import load_iris def datasets_demo() """ sklearn 数据集的使用 return """ iris = load_iris() print("鸢尾花数据集:\n",iris) print('数据集描述,用字典形式:\n',iris['DESCR']) print('特征值的名字,用·属性的方式:',iris.feature_names) return None if __name__ == "__main__": datasets_demo()
-
数据集分析
- daka.keys() 输出数据集字典名称,包括 dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])
- 其中有用的信息就是 data 数据,里面包含了花的各种数据,发现是一个 iris.data.shape* 显示***(150,4)**就是一个有着100行数据,四个字段的二维数组。
- 接下来就查看 feature_name ,iris.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
- 这四个属性分别是 花萼长度,花萼宽度,花瓣长度,花瓣宽度,然后就可以转化成pandas数组了:
pd.DataFrame(data.data, columns=data.feature_names)
-
数据集划分
-
训练数据:构建模型
-
测试数据:评估模型
-
测试集:20%~30%
-
sklearn 实现数据划分
sklearn.model_selection.train_test_split(arrays,*options)
- X 数据集的特征值
- Y 数据集的特征值
- test_size 测试集的大小,一般类型维float
- random_state 随机数种子,因为是hi伪随机,随意需要设定相同的随机数种子来对比不同算法的优劣。
- return 训练集特征值、测试集特征值、训练集目标值、测试集目标值,特征值就是数组中的数据.
-
train_test_split(iris.data,iris.target,test_size=25%,random_state=22) #默认比例25%
-
特征工程介绍
算法 特征工程
-
为什么需要特征工程 – 数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限而已。
-
什么是特征工程
- sklearn 特侦工程
- pandas 数据清洗和数据清晰
-
特征抽取/特征提取
- 机器学习算法 —统计方法—数学公式
- 文本转换成数值
- 类别——》数值
-
特征提取
-
sklearn.feature_extraction()
-
字典特征提取—类别—one-hot编码:就是取消哑变量,因为可以会有数值影响,就用矩阵的形式,哪里有就哪一列向量为1,然后可以转为稀疏矩阵。
sklearn.feature_extraction。DictVectorizer(sparse=Ture,…) ,字典向量化。
-
DictVectorizer的父类就是 transfer 类
-
-
过程:
data=[{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
-
实例化一个转换器类
- from sklearn.feature_extraction import DictVenctorizer #—导入转换器包
- transfer = DictVenctorizer() #实例化转换器类
-
调用fit_transform()方法,里面参数是字典或者包含字典的迭代器
- data_new = transfer.fit_transform(data) #调用对象的方法,把原始的字典格式data传进去,给新的data_new
dict_demo() (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0
data_new.toarray() #用 sparse=False 也可以 Out[10]: array([[ 0., 1., 0., 100.], [ 1., 0., 0., 60.], [ 0., 0., 1., 30.]])
transfer.get_feature_names # 该方法可以获取字段名 ------> transfer.get_feature_names() Out[11]: ['city=上海', 'city=北京', 'city=深圳', 'temperature']
-
-
应用场景:
- pclass,sex 数据集当中类别特征比较多
- 将数据集特征–》字典类型,就是将原始的数据,比如iris数据转化成 [data ,features ] 的字典,当然DataFrame 也是字典。
- 用DictVectorizer 转换
- 本身就是字典数据,就用字典类型抽取
- pclass,sex 数据集当中类别特征比较多
-
文本特征提取CountVectorizer
-
CountVectorizer he TfidfVectorizer, 这两个类都是特征数值计算的常见方法,对于每一个训练文本,CountVectorizer 只考虑每种词汇出现的频率,但是TfidfVectorizer 考虑的不仅是出现的频率,还关注其他训练样本的倒数
-
单词作为特征、句子、短语、单词、字母
-
方法1:CountVectorizer #导入:
from sklearn.feature_extraction.text import CountVectorizer X_test = ["life is short , i like like python","life is too long , i dislike Python"] count_vec = CountVectorizer() # 实例化 data_new = count_vec.fit_transform(X_test).toarray() >>> array([[0, 1, 1, 2, 0, 1, 1, 0], [1, 1, 1, 0, 1, 1, 0, 1]], dtype=int64) #但是看不到特征名字,这时候可以用对象.get_feature_names() count_vec.get_feature_names() >>> ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] #中文就需要分词了,中间需要有空格。
stop_words是停用词,CountVectorizer(stop_words = [‘one’,‘two’,‘…’])
-
-
jieba 分词
-
举例
from sklearn.feature_extraction.text import CountVectorizer import jieba def cut_word(text): a = jieba.cut(text) # 生成器对象 b = list(jieba.cut(text)) # 转化成列表,但是是单个字符的列表 c = ' '.join(b) # 转化成字符串 print('a:%s,b:%s,c:%s'%(a,b,c)) return None if __name__ == '__main__': text = ['我爱北京天安门'] print(cut_word(text)) >>> a:<generator object Tokenizer.cut at 0x000002C3DCC79570>,b:['我', '爱', '北京', '天安门'],c:我 爱 北京 天安门
今天很残酷,明天更残酷,后天很美好,但绝大多数人死在明天晚上,见不着后天的太阳。所以我们干什么都要坚持
我们看到的从很远星系来的光是在几百万年之前发出的,在我们看到的最远的物体的情况下,光是在80亿年前发出的。这样当我们看宇宙时,我们是在看它的过去。
如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的其他事物相联系。
-
文本特征提取Tfidf
-
主要思想:如果某个词语或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,那么认为这个词或短语具有很好的类别区分能力,TF-IDF —重要程度
-
TF: 词频 IDF: 逆向文档频率。
-
举例: 两个词:“经济”,“非常”
1000篇文章-语料库
100篇文章出现-“非常”
10篇文章出现-“经济”
现在出现两篇文章:
文章A(100个词): 10次“经济” TF-IDF:
TF: 10/100 = 0.1
IDF:log(1000/10)=2文章B(100个词): 10次“非常” TF-IDF:
TF:10/100 = 0.1
IDF:(总文件数-语料库/ 包含该词语的文件数,然后取log)
log(1000/100)=1TFIDF = TF × IDF
-
特征预处理
- 归一化/标准化(无量纲化)
X i ′ = x i − m i n m a x − m i n X i ′ ′ = X i ′ ∗ ( m x − m i ) + m i X_i' = \frac{x_i-min}{max-min}\quad \quad X_i''=X_i'*(mx-mi)+mi Xi′=max−minxi−minXi′′=Xi′∗(mx−mi)+mi
(mi , mx)为标准化范围,默认为(0,1),注意是每个字段的最大最小值
[外链图片转存失败(img-mkttzvpq-1563521443712)(C:\Users\sunshunda\Pictures\ScreenCapture\normalize.bmp)]
- sklearn 处理
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)...)
MinMaxScaler.fit_transform(X) #转换器类,就是把原始数据转换的都用fit_transform方法
X:numpy array 格式的数据[n_samples*n_features]
返回值:转换后的形状相同的array
#先导入包
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data = pd.read_csv('dating.txt')#读取数据
transfer = MinMaxScaler()#实例化,括号里面可以写范围,默认是(0,1)
data_new = transfer.fit_transform(data)#转换
data_new#打印
-
归一化缺点 :出现最大值最小值的离群值,就会严重影响数据的鲁棒性,shiyong
-
标准化方式:
X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X′=σx−mean
from sklearn.preprocessing import StandardScaler
import pandas as pd
def stand_demo():
data = pd.read_csv('dating.txt')
transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print('data_new:',data_new,type(data_new))
return None
if __name__ == '__main__':
stand_demo()
目前总结
- 特征抽取(feature_extraction):DictVectorizer, CounetVectorizer, TfidfVectorizer
- 实例化
- 转换 fit_transform(data).toarray()
- transfer.get_feature_names()
- 特征预处理(feature_prepocessing):MinMaxScaler, StandardScaler
- 实例化
- 转换 fit_transform(data)
- 数据降维
数据降维
-
降维—降低维度
ndarray
维度:嵌套的层数
0维 标量
1维 向量
2维 矩阵
3维
n维 张量
这里降维的对象是二维数组,降低的是特征的个数(随机变量),得到一组不相关大的主变量过程,正交化。 -
降维
-
特征选择(feature_selection)
-
Filter 过滤式
-
方差选择法:低方差特征过滤
比如对鸟进行分类,所有的鸟都有眼睛、爪子,所以这个特征的方差就特别小,不能作为分类的特征。
-
相关系数法
特征与特征之间的相关性
-
-
Embeded 嵌入式
- 决策树
- 正则化
- 深度学习
-
方差选择法API
#sklearn.feature_selection.VarianceThreshold(threshold = 0.0) #阈值默认为 0.0 from sklearn.feature_selection import VarianceThreshold import pandas as pd def select(): data = pd.read_csv('factor_returns.csv') transfer = VarianceThreshold() data_new = transfer.fit_transform(data) return None
#pandas 数据处理 data = pd.read_csv('factor_returns.csv') data.keys() # 返回字段列表 data.values() # 返回值列表 data.count() # 返回字段统计 pd.options.display.max_columns = None # 显示所有行 pd.options.display.max_rows = None # 显示所有列 pd.head() # 显示前五行 data = data.iloc[:,1:-2] # 取所有行的第二列到倒数第三列
-
相关系数法
-
皮尔森相关系数
p x , y = c o r r ( X , Y ) = c o v ( X , Y ) σ x σ y = E [ ( X − u x ) ( Y − u y ) ] σ x σ y p_x,_y = corr(X,Y)=\frac{cov(X,Y)}{\sigma_x\sigma_y}=\frac{E[(X-u_x)(Y-u_y)]}{\sigma_x\sigma_y} px,y=corr(X,Y)=σxσycov(X,Y)=σxσyE[(X−ux)(Y−uy)] -
from scipy.stats import pearsonr #计算某两个变量之间的相关性 r = pearsonr(data['pe_ratio'],data['pb_ratio']) >>> (-0.004389322779936274, 0.8327205496591377) #第一个值是相关性,第二个值是p-value(置信度为5%,一般数据量大于500时p值较为可靠)
-
特征与特征之间相关性很高:
- 选取其中一个
- 加权求和
- 主成分分析
-
-
-
主成分分析(PCA) - 降维并尽可能保留更多的信息
- sklearn.decomposition.pca(n_components = None)
n_components
小数 表示保留百分之多少的信息
征数 减少到多少特征 - 先实例化
- fit_transform(data)
- sklearn.decomposition.pca(n_components = None)
-
案例: 探究用户对物品类别的喜好细分
-
用户 物品类别
user_id aisle
1)需要将user_id和aisle放到一张表里(因为他们没在一张表中)
2)找到user_id 和 aisle 的交叉表和透视表
3)有大量的零,特征冗余过多 -
获取数据、合并表、找到user_id 和 aisles之间的联系、pca降维
1)pd.read_csv()
2)合并表,合并aisles & productstb1 = pd.merge(aisles,products,on = ['aisle_id','aisle_id']) # pd.merge(table_1,table_2,on = ['字段名',‘显示字段名’]) tb2 = pd.merge(tb1,order_products,on = ['product_id','product_id']) tb3 = pd.merge(tb2,orders,on = ['order_id','order_id'])
3)交叉表、透视表
tb4 = pd.crosstab(tb3['user_id'],tb3['aisle']) # 交叉透视表,行列
-
-
总结
sklearn数据集
-
加载数据:load_* 、fetch_*
-
数据划分
sklearn.model_selection.train_test_split(arrays,*options)
-
特征抽取
- 字典特征抽取—feature_extraction : DictVectorizer、sparse矩阵
- 文本特征抽取—CountVectorizer 、 TfidfVectorizer
-
无量纲化
- 归一化(MinMaxScaler)
- 标准化(StandardSvaler)
-
特征选择
- 过滤式
- 删除低方差特征(VarianceThreshold)
- 相关系数 pearsonr(x1,x2)
- 主成分分析(pca)
- 后期再讲
- 过滤式