目录
数据集的组成
可用数据集
数据集结构
常用数据集结构:
特征值+目标值
特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
数据的特征抽取
- 特征抽取针对非连续型数据
- 特征抽取对文本等进行特征值化
字典的特征抽取
sklearn特征抽取API:
sklearn.feature_extraction
字典的特征提取的类:
sklearn.feature_extraction.DictVectorizer
DictVectorizer语法
DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器
- 返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
DictVectorizer.get_feature_names()
- 返回类别名称
流程
- 实例化类DictVectorizer()
- 调用方法
def dictvec():
"""
字典数据抽取
:return: None
"""
# 实例化
dict = DictVectorizer(sparse=False)
# 调用fit_transform
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(dict.get_feature_names())
print(dict.inverse_transform(data))
print(data)
return None
运行结果为:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
若实例化时默认sparse=True,则data输出为:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
对文本进行特征值化
文本特征值化的类:
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
"""
对文本进行特征值化
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"])
print(cv.get_feature_names())
print(data.toarray())
return None
运行结果为:
['python', '不用', '人生', '人生漫长', '喜欢', '苦短']
[[1 0 1 0 1 1]
[1 1 0 1 0 0]]
PS:对于长的中文文本,使用jieba库来分割文本。并将分词结果变成字符串当作fit_transform的输入值。
tfidf方式提取文本特征
tf-idf的作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度,是分类机器学习算法的重要依据。
- tf:term frequency
统计词出现的次数(频率) - idf:inverse document frequency 逆文档频率
log(总文档数量/该词出现的文档数量) - tf*idf:重要性
tf-idf的类:
sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法
TfidfVectorizer(stop_words=None,…)
- 返回值:词的权重矩阵
- stop_words:忽略的词
TfidfVectorizer.fit_transform(X,y)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
- 返回值:单词列表
流程
def tfidfvec():
"""
中文特征值化
:return: None
"""
# c1,c2,c3是三个文本分词后得到的列表
c1, c2, c3 = cutword()
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
数据的特征预处理
特征预处理方法:
数值型数据:
归一化
标准化
缺失值处理
类别型数据:
one-hot编码
时间型数据:
对时间的切分、处理
归一化
归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式
语法
归一化的类:
sklearn.preprocessing.MinMaxScaler
归一化语法:
MinMaxScalar(feature_range=(0,1)…)
- 每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
步骤
def mm():
"""
归一化处理
:return: NOne
"""
# 实例化
mm = MinMaxScaler(feature_range=(2, 3))
# 利用MinMaxScaler.fit_transform
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
总结
最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化
标准化:通过对原始数据进行变换把数据变换到均值为0、方差为1范围内。
公式
语法
标准化的类:
scikit-learn.preprocessing.StandardScaler
标准化的语法:
StandardScaler(…)
- 处理之后每列来说所有数据都聚集在均值0附近方差为1
StandardScaler.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
StandardScaler.mean_
- 原始数据中每列特征的平均值
StandardScaler.std_
- 原始数据每列特征的方差
步骤
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
return None
总结
如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
缺失值处理
缺失值通常使用pandas进行处理,而sklearn中也提供了缺失值处理的API。
缺失值处理方法
语法
sklearn中缺失值处理的API:
sklearn.preprocessing.Imputer
Imputer语法
Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
- 完成缺失值插补
Imputer.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
步骤
- 初始化Imputer,指定”缺失值”,指定填补策略,指定行或列(缺失值也可以是别的指定要替换的值)
- 调用fit_transform
def im():
"""
缺失值处理
:return:None
"""
# 实例化
im = Imputer(missing_values='NaN', strategy='mean', axis=0)
# 使用fit_transform
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
关于np.nan
- numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
- 如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可
数据的降维
数据的降维指的是减少特征值的数量,即特征选择。
数据降维的原因:通过特征选择可以减少数据集的冗余和噪声。
三大方法:
Filter 过滤式:VarianceThreshold
(特征选择方式还包括神经网络)
Embedded 嵌入式:正则化、决策树
Wrapper 包裹式
sklearn特征选择:VarianceThreshold
方差特征选择的API为:
sklearn.feature_selection.VarianceThreshold
语法
VarianceThreshold(threshold = 0.0)
- 删除所有低方差特征
Variance.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。
- 默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
步骤
def var():
"""
特征选择-删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=1.0)
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
运行结果为:
[[0]
[4]
[1]]
sklearn降维:PCA
PCA:压缩数据维数,尽可能降低原数据的维数(复杂度),损失少量信息。可以削减回归分析或者聚类分析中特征的数量。
高维度数据容易出现的问题:特征之间通常是线性相关的
PCA的API为:
sklearn. decomposition.PCA
语法
PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components参数可以输入小数,表示保留多少比例的数据
PCA.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
步骤
def pca():
"""
主成分分析进行特征降维
:return: None
"""
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None