目录
1、简介
2、⭐为什么需要特征工程
3、特征抽取
3.1、简介
3.2、特征提取主要内容
3.3、字典特征提取
3.4、"one-hot"编码
3.5、文本特征提取
3.5.1、英文文本
3.5.2、结巴分词
3.5.3、中文文本
3.5.4、Tf-idf
⭐所属专栏:人工智能
文中提到的代码如有需要可以私信我发给你噢
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果
特征工程是机器学习中至关重要的一步,它涉及将原始数据转换为适合机器学习模型的特征(也称为变量或属性)。好的特征工程可以显著提高模型性能,因为它能够揭示数据中的有用信息,降低噪音影响,甚至帮助模型更好地泛化到新数据。
特征工程包含内容
以下是特征工程的一些常见方法和技巧:
在进行特征工程时,需要注意以下几点:
总之,特征工程是机器学习中一个关键且有创造性的阶段,它能够显著影响模型的性能和泛化能力。
机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
以下是特征工程的重要性和原因:
总之,特征工程是机器学习流程中的关键步骤,它可以帮助我们将原始数据转化为更有意义、更适合模型的特征,从而提高模型的性能、泛化能力和解释性。特征工程的好坏直接影响着模型的效果,因此在实际应用中,合适的特征工程往往能够为机器学习任务带来显著的提升。
特征抽取(Feature Extraction)是指从原始数据中自动或半自动地提取出具有代表性和信息丰富度的特征,以用于机器学习和数据分析任务。在特征抽取过程中,原始数据的维度可能会被降低,从而减少计算成本并提高模型的性能和泛化能力。
特征抽取的目标是将原始数据转换为更具有判别性和表达力的特征表示,以便更好地捕获数据中的模式、关系和变异。这有助于提高模型的训练效果,并且可以使模型更好地适应新的未见过的数据。
特征抽取的方法可以包括以下几种:
特征抽取的选择取决于问题的性质、数据的类型以及任务的要求。它在处理高维数据、降低计算成本、提高模型泛化能力等方面具有重要作用,是特征工程的一个关键组成部分。
1、将任意数据(如文本或图像)转换为可用于机器学习的数字特征
特征值化是为了计算机更好的去理解数据
2、特征提取API:sklearn.feature_extraction
作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
from sklearn.feature_extraction import DictVectorizer # 实例化
'''
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
'''
def dict_demo():
"""
对字典类型的数据进行特征抽取
:return: None
"""
data = [
{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}
]
# 1、实例化一个转换器类
transfer1 = DictVectorizer(sparse=False)
transfer2 = DictVectorizer()
# 2、调用fit_transform
data2 = transfer2.fit_transform(data)
data1 = transfer1.fit_transform(data)
print("返回的结果(稀疏矩阵):\n", data2)
print("返回的结果(原始矩阵):\n", data1)
# 打印特征名字
print("特征名字:\n", transfer1.get_feature_names_out())
if __name__ == '__main__':
dict_demo()
结果:
"One-Hot"编码是一种常用的分类变量(也称为类别变量、离散变量)到数值变量的转换方法,用于将类别型数据表示为二进制向量的形式。这种编码方法在机器学习中广泛应用于处理类别型特征,以便将其用于各种算法和模型中。
在"One-Hot"编码中,每个类别被转换为一个唯一的二进制向量,其中只有一个元素为1,其余元素为0。这个元素的位置表示类别的索引或标签。这样做的目的是消除类别之间的顺序关系,以及用离散的0和1表示类别信息,使算法能够更好地处理类别型特征。
以下是一个简单的示例来解释"One-Hot"编码:
假设我们有一个表示动物种类的类别特征,包括猫、狗和鸟。"One-Hot"编码将这三个类别转化为如下形式的向量:
这样,每个类别都被表示为一个唯一的二进制向量,其中对应的位置为1,其余位置为0。
在Python中,可以使用各种工具和库来进行"One-Hot"编码,其中最常用的是Scikit-Learn(sklearn)库的OneHotEncoder类。
以下是一个简单的代码示例:
from sklearn.preprocessing import OneHotEncoder
# 创建OneHotEncoder对象
encoder = OneHotEncoder()
# 假设有一个包含动物种类的数组
animal_categories = [['猫'], ['狗'], ['鸟']]
# 进行One-Hot编码
encoded_categories = encoder.fit_transform(animal_categories).toarray()
# 打印编码结果
print(encoded_categories)
结果:
作用:对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) 返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
sklearn.feature_extraction.text.TfidfVectorizer
下面对以下文本进行分析:["life is short,i like python","life is too long,i dislike python"]
流程分析:
实例化类CountVectorizer
调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
from sklearn.feature_extraction.text import CountVectorizer # 文本特征提取
'''
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) 返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
sklearn.feature_extraction.text.TfidfVectorizer
'''
def text_count_demo():
"""
对文本进行特征抽取,countvetorizer
:return: None
"""
data = [
"life is short,i like like python",
"life is too long,i dislike python"
]
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
if __name__ == '__main__':
text_count_demo()
输出结果:
如果替换成中文,则会出问题:"人生苦短,我喜欢Python" "生活太长久,我不喜欢Python"
为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。
其实就达到了一个分词的效果,所以我们要对中文进行分词处理。
这里需要用到“结巴分词”
结巴分词(jieba)是一个流行的中文文本分词工具,被广泛应用于自然语言处理(NLP)任务中,如文本分析、信息检索、情感分析、机器翻译等。结巴分词是基于Python开发的开源项目,它提供了一种可靠高效的中文分词解决方案。
以下是结巴分词的一些特点和功能:
案例分析:
对以下三句话进行特征值化:
今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。
如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
分析:
准备句子,利用jieba.cut
进行分词
实例化CountVectorizer
将分词结果变成字符串当作fit_transform
的输入值
from sklearn.feature_extraction.text import CountVectorizer # 文本特征提取
import jieba # 结巴分词
'''
使用结巴分词,对中文特征进行提取
'''
def text_chinese_count_demo2():
"""
对中文进行特征抽取
:return: None
"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 将原始数据转换成分好词的形式
text_list = []
for sent in data:
text_list.append(" ".join(list(jieba.cut(sent)))) # 这里使用结巴分词
print(text_list)
# 1、实例化一个转换器类
# transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer()
# 2、调用fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
if __name__ == '__main__':
text_chinese_count_demo2()
结果:
但如果把这样的词语特征用于分类,会出现什么问题?
该如何处理某个词或短语在多篇文章中出现的次数高这种情况?
这种情况下,我们需要用到"Tf-idf文本特征提取"。
TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,用于将文本数据转换为数值特征表示,以便用于机器学习和信息检索任务。
TF-IDF反映了一个词在文本中的重要性,同时考虑了词频和文档频率的影响。
TF-IDF文本特征提取的原理如下:
公式:
TF-IDF的优点在于它可以凸显文本中的关键词,过滤掉一些无意义的常见词,并为文本赋予数值特征,使得文本数据适用于各种机器学习算法。
案例:
from sklearn.feature_extraction.text import TfidfVectorizer # TF-IDF特征提取
import jieba # 结巴分词
'''
提取TF-IDF特征
'''
def text_chinese_tfidf_demo():
"""
对中文进行特征抽取
:return: None
"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 将原始数据转换成分好词的形式
text_list = []
for sent in data:
text_list.append(" ".join(list(jieba.cut(sent)))) # 这里使用结巴分词
print(text_list)
transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
# 2、调用fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
if __name__ == '__main__':
text_chinese_tfidf_demo()
TF-IDF特征提取如下:
这段输出表示TF-IDF文本特征抽取的结果,是一个特征矩阵,其中每一行代表一个文本样本,每一列表示一个单词的TF-IDF得分。
TF-IDF(词频-逆文档频率)是一种用于衡量一个词在文本中的重要性的指标,结合了词频(TF)和逆文档频率(IDF)。TF-IDF越高,说明该词在当前文本中越重要且越不常见于其他文本。
以下是对输出矩阵的解释:
在这个特征矩阵中,每一行表示一个文本样本,每一列对应一个单词(词汇表中的词)。
每个元素表示对应单词在对应文本中的TF-IDF得分。
这个矩阵将文本数据转换为数值特征表示,可以作为机器学习算法的输入。
通常情况下,为了方便理解,这些得分会在实际应用中进行归一化或者规范化处理。
Tf-idf的重要性:分类机器学习算法进行文章分类中前期数据处理方式