一、机器学习概述
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。
eg. AlphaGo下棋机器人、广告搜索
为什么需要机器学习?
- 解放生产力(智能客服)
- 解决专业问题(ET医疗)
- 提供社会便利
机器学习目的:让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。
二、 特征工程和文本特征提取
2.1 数据集的组成
可用数据集:
- Kaggle特点:
- 大数据竞赛平台
- 80万科学家
- 真实数据
- 数据量巨大
- UCI特点:
- 收录了360个数据集
- 覆盖科学、生活、经济等领域
- 数据量几十万
- scikit-learn特点:
- 数据量较小
- 方便学习
常用数据集数据的结构组成:特征值+目标值(有些数据集可以没有目标值)
2.2 特征工程
1) 数据中对于特征的处理:
- pandas:一个数据读取非常方便以及基本的处理格式的工具
- sklearn:对于特征的处理提供了强大的接口
2) 特征工程是什么?
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。
3) 特征工程的意义:直接影响预测结果。
4) 特征抽取:对文本等数据进行特征值化(为了计算机更好的去理解数据)
2.3 字典特征数据抽取
1) 作用:对字典数据进行特征值化(把字典中一些类别数据,分别进行转换成特征)
类:sklearn.feature_extraction.DictVectorizer
one-hot编码
2) DictVectorizer语法
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():
"""
字典数据抽取
:return: None
"""
# 实例化
# dict = DictVectorizer(sparse=False)
dict = DictVectorizer()
print("调用fit_transform")
data = dict.fit_transform([{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(data)
print("调用get_feature_names,返回类别名称")
print(dict.get_feature_names())
print("调用inverse_transform")
print(dict.inverse_transform(data))
return None
if __name__ == "__main__":
dictvec()
2.4 文本特征抽取
1)作用:对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer() 返回词频矩阵(对于单个英文字母/汉字不统计)
- CountVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
- CountVectorizer.get_feature_names()
- 返回值:单词列表
2)用途:
- 文本分类
- 情感分析
3)中文特征值化
jieba分词
下载:pip3 install jieba
使用:import jieba jieba.cut("我是好人")
返回值:词语生成器
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def countvec():
"""
对文本进行特征值化
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["life is is short, and I like python", "life is long, and I dislike python"])
print(cv.get_feature_names())
print(data.toarray())
return None
def cutword():
cw1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
cw2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看她的过去。")
cw3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真在了解它。了解事物的真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(cw1)
content2 = list(cw2)
content3 = list(cw3)
# 列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
return None
if __name__ == "__main__":
countvec()
hanzivec()
2.5 tf-idf分析问题
tf: term frequency词的频率
idf: inverse document frequecy逆文档频率 log(总文档数量/该词出现的文档数量)
tf * idf——重要性程度
主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
用法:
TfidfVectorizer(stop_words=None,...) 返回词的权重矩阵
- TfidfVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
- TfidfVectorizer.get_feature_names()
- 返回值:单词列表
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cutword():
cw1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
cw2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看她的过去。")
cw3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真在了解它。了解事物的真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(cw1)
content2 = list(cw2)
content3 = list(cw3)
# 列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def tfidfvec():
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
if __name__ == "__main__":
tfidfvec()
三、数据特征预处理
3.1 归一化以及标准化对比
1)归一化公式计算过程
归一化特点:通过对原始数据进行变换把数据映射到(默认为[0, 1])之间。
公式:X' = (x-min)/(max-min) X''=X'*(mx-mi)+mi
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X''为最终结果,mx, mi分别为指定区间值默认mx为1, mi为0
2)sklearn归一化API: sklearn.preprocessing.MinMaxScalar
MinMaxScalar(feature_range(0, 1)...) 每个特征缩放到给定范围(默认[0, 1])
- MinMaxScalar.fit_transform(X)
- X: numpy array格式的数据[n_samples, n_features]
- 返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
# 归一化处理
:return: None
"""
mm = MinMaxScaler()
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
return None
if __name__ == "__main__":
mm()
3)归一化案例:约会对象数据