从零开始学ai-机器学习篇 2.特征工程

特征工程

本章需要使用到sklearn库,详细步骤就不说了,大家自行解决

特征工程的目的

目的是最大限度地从原始数据中提取特征以供算法和模型使用

sklearn对特征工程API的简单解释

sklearn对特征工程的封装很好,使用起来非常友善.以下是对其api的解释

xx.fit_transform()

将数据放入xx模型进行计算和转换

xx.inverse_transform()

返回转化之前的数据格式(可选array或者sparse的格式)

xx.get_feature_names()

返回转化后的类别名称

xx.transform()

按照原先的训练数据进行转化

字典特征抽取

  • 作用:对字典数据进行特征值化
  • 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

def dictvec():
    """
    字典数据抽取:把字典中一些类别数据,分别进行转换成特征
    """
    #实例化 sparse格式节约内存,方便读取
    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
    
if __name__ == "__main__":
    dictvec()
代码结果
['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.]]

文本特征抽取

  • 作用:对文本数据进行特征值化

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

# 实例化CountVectorizer
vector = CountVectorizer()

# 调用fit_transform输入并转换数据

res = vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])

# 打印结果
print(vector.get_feature_names())

print(res.toarray())
代码结果
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

TF-IDF

TF-IDF的主要思想是:

如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类

tf(term frequency)词频

出现次数

idf(inverse document frequency)逆文档频率

log(总文档数量/该词出现的文档数量)

tf*idf 重要性程度

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

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
    
def chinavec():
    c1,c2,c3 = cutword()
    
    # 实例化
    tf = TfidfVectorizer()
    
    data = tf.fit_transform([c1,c2,c3])
    
    # 统计单词列表 (单个字母不统计)
    print(tf.get_feature_names())
    
    print(data.toarray())
    
    return None
    
if __name__ == "__main__":
    chinavec()
代码结果
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝大部分', '美好', '联系', '过去', '这样']
[[0.         0.         0.2236068  0.         0.         0.
  0.4472136  0.         0.         0.         0.         0.
  0.2236068  0.         0.         0.         0.         0.
  0.2236068  0.2236068  0.         0.4472136  0.         0.2236068
  0.         0.4472136  0.2236068  0.         0.         0.
  0.2236068  0.2236068  0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.2410822  0.55004769
  0.         0.         0.         0.         0.2410822  0.
  0.         0.         0.         0.48216441 0.         0.
  0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.15698297 0.15698297 0.         0.1193896
  0.         0.         0.15698297 0.         0.         0.
  0.15698297 0.         0.         0.         0.31396594 0.15698297
  0.         0.         0.15698297 0.         0.        ]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值