**什么是机器学习 **
机器学习是从数据
中自动分析获得规律(模型)
,并利用规律对未知数据进行预测
为什么需要机器学习
解放生产力(智能客服)
解决专业问题(ET医疗)
提供社会便利(城市大脑)
机器学习的应用场景
自然语言处理
无人驾驶
计算机视觉
推荐系统
注
:离散型是区间内不可分,连续型是区间内可分特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
特征工程直接影响模型的预测结果
Python语言的机器学习工具
Scikit-learn包括许多知名的机器学习算法的实现
Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。
pip3 install Scikit-learn
# 特征抽取
#
# 导入包
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]]
特征抽取针对非连续型数据
特征抽取对文本等进行特征值化
注:特征值化是为了计算机更好的去理解数据
Application Programming Interface 应用编程接口
sklearn.feature_extraction
对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer
(1)DictVectorizer语法
DictVectorizer.fit_transform(X)
DictVectorizer.inverse_transform(X)
DictVectorizer.get_feature_names()
DictVectorizer.transform(X)
(2)流程
实例化类DictVectorizer
调用fit_transform
方法输入数据并转换注意返回格式
# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
#实例化
dict=DictVectorizer()
data=dict.fit_transform([{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
)
print(data)
return None
if __name__ == "__main__":
dictvec()
>>> #默认返回sparse矩阵
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
若dict=DictVectorizer(sparse=False)
,结果:(ndarray,数组)
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
print(dict.get_feature_names())
['city=上海', 'city=北京', 'city=深圳', 'temperature']
字典数据抽取:把字典中一些类别的数据,分别转化成特征
(3)one-hot编码分析
将有类别的特征转化成one-hot编码形式,有利于数据的处理
图片引用自:https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html
对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer
(1)CountVectorizer语法
CountVectorizer(max_df=1.0,min_df=1,…)
CountVectorizer.fit_transform(X,y)
CountVectorizer.inverse_transform(X)
CountVectorizer.get_feature_names()
实例:
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
cv=CountVectorizer()
data=cv.fit_transform(["life is short,i like python",
"life is too long,i dislike python"]
)
print(cv.get_feature_names()) #统计所有文章中所有词,重复的看做一次
print(data.toarray()) #对每篇文章,在词的列表里进行统计每个词出现的次数,单个字母不统计
return None
countvec()
>>>
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
单个字母不统计,因为:没有分类依据
中文也可以进行处理,但是不会自动分词,可以调用jieba
(2)jieba分词
案例:对三段话进行特征值化
1、今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
2、我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。
3、如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
from sklearn.feature_extraction.text import CountVectorizer
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)
print(con1) #返回值:词语生成器
print(content1)
print(c1)
return c1,c2,c3
def hanzivec():
c1,c2,c3=cutword()
cv = CountVectorizer()
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
return None
if __name__ == "__main__":
hanzivec()
>>>
['今天', '很', '残酷', ',', '明天', '更', '残酷', ',', '后天', '很', '美好', ',', '但', '绝对', '大部分', '是', '死', '在', '明天', '晚上', ',', '所以', '每个', '人', '不要', '放弃', '今天', '。']
今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
(3)TF-IDF
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
分类机器学习算法的的重要依据
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法
TfidfVectorizer(stop_words=None,…)
TfidfVectorizer.fit_transform(X,y)
TfidfVectorizer.inverse_transform(X)
TfidfVectorizer.get_feature_names()
案例:
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())
tfidfvec()
>>>
今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0.21821789 0.21821789 0. 0.43643578 0.
0.21821789 0. 0.43643578 0.21821789 0. 0.
0. 0.21821789 0.21821789 0. 0. 0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 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. 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. ]]
Process finished with exit code 0