数据的提取
数据集的网站
kaggle:https://www.kaggle.com/
uci:http://archive.ics.uci.edu/ml/index.php
scikit-learn:https://scikit-learn.org/stable/index.html
常用数据集的结构组成
按照机器学习的数据分类我们可以将数据分成:
-
标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)
-
数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)
按照数据的本身分布特性 -
离散型
-
连续型
那么什么是离散型和连续型数据呢?首先连续型数据是有规律的,离散型数据是没有规律的 -
离散变量是指其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等
-
连续型数据是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据
注意:有些数据集可能没有目标值,机器学习,一般重复数据一般不会影响
特征工程的描述
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性
- 它会直接影响预测结构
- 特征化是为了计算器更好的理解数据
- 特征抽取针对非连续型数据
- 特征抽取对文本等进行特征值化
字典特征数据抽取
DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器
- 返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵 - 返回值:转换之前数据格式
DictVectorizer.get_feature_names()
- 返回类别名称
DictVectorizer.transform(X)
- 按照原先的标准转换
from sklearn.feature_extraction import DictVectorizer # 字典特征提取,转化成one_hot 编码
# 实例化
dict_=DictVectorizer(sparse=False)
# sparse默认是True 为True时就会成为元组 +数据 元组为位置
data=dict_.fit_transform([{'city':'北京','temperat':100},{'city':'上海','temperat':60},{'city':'深圳','temperat':30}])
# 返回sparse 矩阵,优势节约内存,方便读取处理
print(dict_.get_feature_names())
# 这里的data与dict_.get_feature_names()比较,就是把字典中的数据,分别进行转换特征
print(data)
# 将特征值返回原来的形式
print(dict_.inverse_transform())
文本的特征抽取
CountVectorizer(max_df=1.0,min_df=1,…)
- 返回词频矩阵
CountVectorizer.fit_transform(X,y)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
CountVectorizer.get_feature_names()
- 返回值:单词列表
中文文本提取:
from sklearn.feature_extraction.text import CountVectorizer # 文本特征抽取需要调佣的包
import jieba
# 先分词
con1=' '.join(jieba.cut("今天很残酷,明天更残酷,后头很美好,但绝大部分是死在明天晚上,所以每个人不要放弃今天"))
con2=' '.join(jieba.cut("我们看到的从很远星系来的关是在几百年前出发的,这样当我们看到宇宙时,我们是在看它的过去"))
con3=' '.join(jieba.cut("如果只用了一种方式了解某样事物,你就不会真正了解它,了解事物真正的含义的密码取决于如何与其我们所了解的事物相联系"))`在这里插入代码片`
content=[con1,con2,con3]
# 实例化CountVectorizer
vector = CountVectorizer() # 这里面没有sparse参数
# 调用 fit_tarnsform 输入并转化数据
res=vector.fit_transform(content)
# 打印出这两句话中不重复的单词
print(vector.get_feature_names())
# print(res) # 这个可以打开试试
'''
1.vector.get_feature_names()单个词不统计
2.toarray() 把sparse转化为列表
3.对每个文本,在vector.get_feature_names()列表进行词的统计
'''
print(res.toarray())
英文文本提取:
# 特征抽取
from sklearn.feature_extraction.text import CountVectorizer # 文本特征抽取需要调佣的包
# 实例化CountVectorizer
vector = CountVectorizer() # 这里面没有sparse参数
# 调用 fit_tarnsform 输入并转化数据
res=vector.fit_transform(['life is short ,i like python','life is too long,i dislike python'])
# 打印出这两句话中不重复的单词
print(vector.get_feature_names())
print(res)
'''
1.vector.get_feature_names()单个词不统计
2.toarray() 把sparse转化为列表
3.对每个文本,在vector.get_feature_names()列表进行词的统计
'''
print(res.toarray())
TF-IDF(重要性的特征处理)
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。
TF-IDF作用
:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
。
- 分类机器学习算法的的重要依据
TfidfVectorizer语法:
TfidfVectorizer(stop_words=None,…)
- 返回词的权重矩阵
TfidfVectorizer.fit_transform(X,y)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
- 返回值:单词列表
from sklearn.feature_extraction.text import TfidfVectorizer # 词的重要性需要调佣的包
import jieba
# 先分词
con1=' '.join(jieba.cut("今天很残酷,明天更残酷,后头很美好,但绝大部分是死在明天晚上,所以每个人不要放弃今天"))
con2=' '.join(jieba.cut("我们看到的从很远星系来的关是在几百年前出发的,这样当我们看到宇宙时,我们是在看它的过去"))
con3=' '.join(jieba.cut("如果只用了一种方式了解某样事物,你就不会真正了解它,了解事物真正的含义的密码取决于如何与其我们所了解的事物相联系"))
content=[con1,con2,con3]
# 实例化CountVectorizer
vector = TfidfVectorizer(stop_words=None) # 这个是查出这些词的重要性 ,stop_words有来记录是否需要这个词
# 调用 fit_tarnsform 输入并转化数据
res=vector.fit_transform(content)
# 打印出这两句话中不重复的单词
print(vector.get_feature_names())
'''
1.vector.get_feature_names()单个词不统计
2.toarray() 把sparse转化为列表
3.对每个文本,在vector.get_feature_names()列表进行词的统计
'''
print(res.toarray())
归一化(MinMaxScaler
什么时候归一化?
几个特征同等重要的的时候进行归一化
目的:使得某个特征对最终结果不会造成更大影响
如果数据中异常点比较多,会有什么影响?
异常点对最大值最小值影响太大
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’
为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
MinMaxScaler语法:
MinMaxScalar(feature_range=(0,1)…)
- 每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler
mm=MinMaxScaler(feature_range=(2,3)) # 规定范围为2--3
data=mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
归一化的总结:
注意在特定场景下最大值最小值是变化的,
另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化(standarScaler)
1、特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内
StandardScaler语法:
处理之后每列来说所有数据都聚集在均值0附近方差为1/
StandardScaler.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
StandardScaler.mean_
- 原始数据中每列特征的平均值
StandardScaler.std_
- 原始数据每列特征的方差
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
data=std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
print(data)
标准化的总结
在已有样本足够多的情况下比较稳定
,适合现代大数据场景
归一化和标准化的特征
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
缺失值处理:(imputer)
Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
- 完成缺失值插补
Imputer.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
from sklearn.impute import SimpleImputer
import numpy as np
imputer = SimpleImputer(missing_values=np.nan, strategy = "mean") # strategy 是用什么方法
data=imputer.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)