文章目录
特征工程
1 数据集
1.1 数据集的获取
- 花钱:公司内部:百度;数据接口。
- 免费—学习阶段可使用的数据集:
- sklearn
- kaggle
- UCI
这里介绍的是我们经常使用的sklearn数据集。
2 sklearn数据集
2.1 sklearn数据的获取
sklearn.datasets
- load_* 获取小规模数据集
例子:
sklearn.datasets.load_iris()
- fetch_* 获取大规模数据集
例子:
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
2.2 sklearn数据集的返回值
datasets.base.Bunch(继承自字典)
dict["key"] = values
bunch.key = values
2.3sklearn数据集的划分
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
测试集 20%~30%
sklearn.model_selection.train_test_split(arrays, *options)
训练集特征值,测试集特征值,训练集目标值,测试集目标值
x_train, x_test, y_train, y_test
2.4对sklearn数据的使用
代码展示:
from sklearn.datasets import load_iris#小规模:load大规模:bunch
from sklearn.model_selection import train_test_split
def datasets_demo():
'''
sklearn数据集的使用
'''
#1、数据集的获取
iris=load_iris()
print("花数据集:\n",iris)
print("查看数据集的描述:\n",iris["DESCR"])
print("查看特征值的名字:\n",iris.feature_names)
print("查看特征值:\n",iris.data.shape)
#2、数据集的划分
#训练集特征值,测试集特征值,训练集目标值,测试集目标值
#x_train, x_test, y_train, y_test
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
print("训练集的特征值:\n",x_train,x_train.shape)
return None
结果展示:
3 特征工程
特征抽取:将任意数据集转化成用于机器学习的数字特征
sklearn.feature_extraction
3.1字典特征提取
- 类别->one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
vector 数学:向量 物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组
- sparse稀疏矩阵
将非零值 按位置表示出来
节省内存 - 提高加载效率 - 应用场景
- pclass, sex 数据集当中类别特征比较多
将数据集的特征->字典类型
DictVectorizer转换 - 本身拿到的数据就是字典类型
3.1.1 字典特征抽取案例
代码展示:
from sklearn.feature_extraction import DictVectorizer
'''
特征抽取:将原始数据特征值化。
'''
def dict_demo():
'''
字典特征提取
'''
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
#1、实例化一个转换类DictVectorizer
transfer=DictVectorizer(sparse=True)
#2、调用fit_transform,转换数据
data_new=transfer.fit_transform(data)
print("data_new:\n",data_new.toarray(),type(data_new))
print("特征名字:\n",transfer.get_feature_names())
return None
结果:
3.2 文本特征抽取
一般情况是让单词作为特征。
特征:特征词
- 方法1:CountVectorizer
统计每个样本特征词出现的个数。
stop_words停用的词表
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少 - 方法2:TfidfVectorizer
TF-IDF - 重要程度
TF - 词频(term frequency,tf)
IDF - 逆向文档频率
例子
比如说我们有两个次“经济”,“非常”。语料库有1000篇文章,其中100篇中有“非常”,10篇“经济”。 - 文章A(100词):10次“经济”TF-IDF:0.2
- tf:10/100=0.1
- idf:lg 1000/10=2
- 文章B(100词):10次“非常” TF-IDF:0.1
- tf:10/100=0.1
- idf:log 10 1000/100=1
3.2.1 英文文本特征提取案例
代码展示:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def count_demo():
'''
英文文本特征提取
'''
data = ["life is short,i like like python", "life is too long,i dislike python"]
#1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
transfer=CountVectorizer(stop_words=["is","too"])#停用词stop_words
#2、调用fit_transform
data_new=transfer.fit_transform(data)
print("data_new\n",data_new.toarray())
print("特征的名字:\n",transfer.get_feature_names())
return None
结果:
3.2.2中文文本特征抽取
代码展示:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def count1_demo():
'''
中文文本特征提取
'''
data = ["一 二三 四五", "上 山打 老虎"]
#1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
transfer=CountVectorizer()
#2、调用fit_transform
data_new=transfer.fit_transform(data)
print("data_new\n",data_new.toarray())
print("特征的名字:\n",transfer.get_feature_names())
return None
if __name__=="__main__":
count1_demo()
结果:
3.2.3中文文本特征抽取——自动分词
代码:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def cut_word(text):
'''
进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
'''
text=" ".join(list(jieba.cut(text)))
return text
def count_chinese_demo():
'''
中文文本特征提取,自动分词
'''
# 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new=[]
for sent in data:
data_new.append(cut_word(sent))
#print(data_new)
#1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
transfer=CountVectorizer(stop_words=["一种","今天"])
#2、调用fit_transform
data_fianl=transfer.fit_transform(data_new)
print("data_new\n",data_fianl.toarray())
print("特征的名字:\n",transfer.get_feature_names())
return None
if __name__=="__main__":
count_chinese_demo()
结果:
3.2.4用TF-IDF的内容进行抽取
代码:
def cut_word(text):
'''
进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
'''
text=" ".join(list(jieba.cut(text)))
return text
def tfidf_demo():
'''
用TF-IDF的内容进行抽取
'''
# 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new=[]
for sent in data:
data_new.append(cut_word(sent))
#print(data_new)
#1、实例化一个转化器类.
transfer=TfidfVectorizer(stop_words=["一种","今天"])
#2、调用fit_transform
data_fianl=transfer.fit_transform(data_new)
print("data_new\n",data_fianl.toarray())
print("特征的名字:\n",transfer.get_feature_names())
return None
if __name__=="__main__":
tfidf_demo()
结果: