可用数据集
特征工程
数据处理
作为特征工程的第一步我们需要对数据进行简单的处理,对于不同类型的数据,我们有如下处理方法
数值型数据:标准缩放:
- 归一化
- 标准化
- 缺失值
类别型数据:one-hot编码
时间类型:时间的切分
类别型数据及数据处理包sklearn介绍
我们一般用的是sklearn进行特征抽取
DictVectorizer.fit_transform(X) 把字典或者字典迭代器变为Sparse矩阵。正常矩阵[[0,3,0,4],[1,1,0,0]]的Sparse矩阵就是(0,1) 3 (0,3) 4 (1,0) 1 (1,1) 1。
inverse_transform是把Sparse矩阵或者正常矩阵转化回字典或者字典迭代器
从get_feature_names中我们可以看到dict的结构是北京,上海,深圳这种类别写成[1,0,0]这种one-hot矩阵,temperature这种数值就不去动它。
from sklearn.feature_extraction import DictVectorizer
# 实例化
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)
中文文本数据
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"])
print(cv.get_feature_names())
print(data.toarray()) #sparse矩阵转化为正常矩阵
为了防止收集到的特征太长,可以适当去掉一些特征,比如单个字母的之类,这个根据机器学习目的做调整
注意!中文每次词要中间隔开,否则一句话就是一个特征。
可是一般输入的语句都是一整句的。我们用jieba这个库来用空格分开
import jieba
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 吧列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
tf-idf
词的特征一般不选择词频而是选择tf-idf。因为最能代表文章意思的词很可能不是出现最多的词,因为文章里面出现最多的词一般是一些连接词,比如“但是”之类的,所以我们常用tf-idf来作为词的特征。
tf: “Term Frequency” 词频。idf: “inverse document frequency” 逆文档频率,表示词在所有文章中出现的频率,如果一个词在所有文章中都经常出现,那么说明这个词没有任何意义。然后tf-idf是tf和idf相乘。
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
def tfidfvec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
数值型数据
归一化
但是归一化不常用,因为如果存在异常数据的情况下,比如有两个异常数据,导致最小值非常小,最大值非常大,那么别的数据在归一化过后就会非常小。导致出错,所以我们一般使用标准化
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return: NOne
"""
mm = MinMaxScaler(feature_range=(2, 3)) # 这是归一化到2和3,一般是0到1就不用参数
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
标准化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxfHb6OU-1594526505828)(./img/标准化.png)],由于用的是平均值,所以当出现异常值的时候会被样本数量,异常会被平均掉。经过标准化把数据转化为均值为0,标准差为1的数据。
from sklearn.preprocessing import StandardScaler
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
return None
缺失值处理
def im():
"""
缺失值处理
:return:NOne
"""
# NaN, nan
im = Imputer(missing_values='NaN', strategy='mean', axis=0)
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
数据降维
-
特征选择
Filter 过滤式,VarianceThreshold。去除掉方差小于阈值的特征,因为这些特征反映不了差别
Embedded 嵌入式:正则化,决策树Filter
from sklearn.feature_selection import VarianceThreshold 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
Embedded
-
主成分分析
特征达到上百个的时候进行简化