首页 > 人工智能 > > 【机器学习】特征工程与模型调优
特征就是从数据中抽取出来的对结果预测有用的信息。
特征工程是使用专业知识背景知识和技巧处理数据,是得特征能在机器学习算法上发挥更好的作用的过程。
数据清洗做的事情:洗掉脏数据
思考角度:
1、单维度考量
2、统计方法
分类问题中,很多情况下正负样本是不均衡的。比如患某些疾病的患者和健康人。
大多数模型对正负样本比是敏感的(如逻辑回归LR)
解决方法:随机采样、分层采样
如果是正样本>>负样本,而且量都很大:在正样本下采样。(如正样本200万个,负样本20万个,此时在正样本中随机采样20万个,正负样本1:1构建分类器)
如果是正样本>>负样本,量不大:1、采集更多数据;2、可以oversampling,即过采样(如有10万正样本,1000负样本,最简单的方法是将1000负样本多重复几遍。然而这样做可能会加大过拟合风险,故会将负样本经过一些小的处理。如图像识别里面判断是否为猫,可将图片旋转?镜像处理?加上一些噪声?均可);3、修改损失函数。
1、幅度调整/归一化
- 幅度缩放Scaling
- 标准化Standardization
- 归一化Normalization

2、将数值进行Log等变化
3、统计值max、min、mean、std
4、离散化
对连续值可以将其离散化,按照一个区间来分(分箱、分桶)
下面代码生成满足标准高斯分布的20个随机数,使用pandas的cut函数可以将数据划分。
import numpy as np
import pandas as pd
arr = np.random.randn(20)
factor = pd.cut(arr,4)
factor
Out[5]:
[(-0.643, 0.329], (0.329, 1.302], (-1.616, -0.643], (-1.616, -0.643], (-0.643, 0.329], ..., (-0.643, 0.329], (-0.643, 0.329], (-0.643, 0.329], (0.329, 1.302], (-1.616, -0.643]]
Length: 20
Categories (4, interval[float64]): [(-2.593, -1.616] < (-1.616, -0.643] < (-0.643, 0.329] < (0.329, 1.302]]
5、高次与四则运算特征
通过高次多项式或四则运算来将数据升维。
6、数值转为类别
1、one_hot编码/哑变量
原数据

做one_hot编码之后

注:不适合类别特别多的字段
2、Hash技巧

如上图,将文本型映射成向量
时间型数据既可以看成连续值,又可以看成离散值。
1、文本型
词袋模型/bag of words
word2vec
文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。

上述向量没有加上词的顺序,可以将词袋中的词扩充到n-gram。下图即为将“Bi-grams are cool!”这句话映射成1个单词和两个单词。

Tf-idf特征
Tf-idf是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随它在语料库中出现的频率成反比下降。
TF(t) = (词t在当前文中出现的次数)/(t在全部语料库中出现的次数)
IDF(t)=ln(总文档数/含t的文档数)
TF-IDF权重 = TF(t)*IDF(t)
2、统计特征

特征选择意义:
特征选择VS降维:
相关的Python包:

#SelectKBest选择排名前k个的特征
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
#chi2是卡方统计量
from sklearn.feature_selection import chi2
iris = load_iris()
X,y = iris.data,iris.target
# 之前的X数据集是有4个特征的
X.shape
Out[13]: (150, 4)
# 使用SelectKBest,使用卡方统计量,选出top2的两个特征
X_new = SelectKBest(chi2,k=2).fit_transform(X,y)
X_new.shape
Out[15]: (150, 2)

几个参数estimato为选择的模型,n_features_to_select为迭代到最后几个特征值。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
boston = load_boston()
lr= LinearRegression()
rfe = RFE(lr,n_features_to_select=1)
X = boston["data"]
# 数据有13个特征
X.shape
Out[27]: (506, 13)
Y = boston["target"]
names = boston["feature_names"]
rfe.fit(X,Y)
Out[28]:
RFE(estimator=LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False),
n_features_to_select=1, step=1, verbose=)
# 使用递归特征删除算法,将数据的13个特征排序,数字为对应特征的序号
rfe.ranking_
Out[29]: array([ 8, 10, 9, 3, 1, 2, 13, 5, 7, 11, 4, 12, 6])
一般用L1正则化来进行特征选择,用L2正则化来防止过拟合。
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X,y = iris.data,iris.target
# 之前的特征数为4
X.shape
Out[6]: (150, 4)
# 使用线性SVM分类器,正则化选L1正则化
lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(X,y)
model = SelectFromModel(lsvc,prefit=True)
X_new = model.transform(X)
# L1正则化后选择的特征数为3
X_new.shape
Out[10]: (150, 3)来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69966952/viewspace-3144064/ ,如需转载,请注明出处,否则将追究法律责任。