1. 什么是机器学习
1.1 数据集的构成
pandas:一个数据读取非常方便以及基本的处理格式的⼯具 真正的多线程 4个线程。
==*numpy:释放了GIL*==
sklearn:对于特征的处理提供了强大的接口。
机器学习的数据:csv文件
MySQL:
1、性能瓶颈,读取速度
2、格式不太符合机器学习要求数据的格式
1.1.1 数据类型
1.1.2 可用数据集
kaggle地址 | UCI数据集网址|scikit_learn网址
1.1.3 常用数据集数据的结构组成
注意:有些数据集可以没有目标值
1.2 特征工程的定义
1.2 数据的特征抽取
# 导入包
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)
print(res.toarray())
输出:['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
(0, 2) 1 sparse矩阵
(0, 1) 1
(0, 6) 1
(0, 3) 1
(0, 5) 1
(1, 2) 1
(1, 1) 1
(1, 5) 1
(1, 7) 1
(1, 4) 1
(1, 0) 1
[[0 1 1 1 0 1 1 0] 数组
[1 1 1 0 1 1 0 1]]
1.2.1 字典特征抽取
字典特征抽取:把字典中的一些类别数据,分别转化成特征值。
from sklearn.feature_extraction import DictVectorizer
def dictves():
"""
字典数据抽取
:return:None
"""
# 实例化
dict = DictVectorizer()
# 调用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
输出:['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
1.2.2 文本特征抽取及中文问题处理
1.统计所有文章出现的所有词
2.每个词只统计一次
3.单个词不统计
4.文本特征抽取适用于情感分析
def countves(): #适用于情感分析
"""
对文本进行特征值化
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"])
print(cv.get_feature_names())
print(data.toarray())
return None
输出:['python', '不用', '人生', '人生漫长', '喜欢', '苦短']
[[1 0 1 0 1 1]
[1 1 0 1 0 0]]
思考:如何去对中文进行特征值化
from sklearn.feature_extraction.text import CountVectorizer, 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 hanzivec():
"""
中文特征值化
:return:None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3]) # 返回的是sparse矩阵
print(cv.get_feature_names())
print(data.toarray())
print(data) # 返回的是sparse矩阵
return None
输出:今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。
通过jieba.cut将句子分割成一个字符串,每个词用空格隔开。
输出:['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[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]]
(0, 6) 2
(0, 26) 2
(0, 22) 2
(0, 12) 1
(0, 32) 1
(0, 31) 1
(0, 14) 1
(0, 24) 1
(0, 19) 1
(0, 27) 1
(0, 2) 1
(0, 20) 1
(1, 18) 3
(1, 28) 2
(1, 23) 1
(1, 7) 1
(1, 8) 1
(1, 3) 1
(1, 9) 1
(1, 35) 1
(1, 17) 1
(1, 34) 1
(2, 18) 1
(2, 16) 1
(2, 11) 1
(2, 0) 1
(2, 21) 1
(2, 4) 4
(2, 25) 1
(2, 5) 3
(2, 1) 1
(2, 29) 2
(2, 13) 1
(2, 30) 1
(2, 10) 1
(2, 15) 1
(2, 33) 1
1.2.3 tf-df分析问题
def tfidfvec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(data)
print(tf.get_feature_names())
print(data.toarray())
return None
输出:[[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. ] 反应的是重要性
1.2.4 特征预处理:归一化和标准化
特征预处理:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/122b6fb0f164c39cd5945181ac967132.png#pic_center)
特征预处理方式:
归一化处理:
什么时候进行归一化?
答:多个特征同等重要是进行归一化。
from sklearn.preprocessing import MinMaxScaler, StandardScaler
def mm():
"""
归一化处理
:return: None
"""
mm = MinMaxScaler() # feature_range=(2,3) 不写默认(0,1)
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
return None
输出:[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
标准化处理
from sklearn.preprocessing import MinMaxScaler, StandardScaler
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
print(data)
return None
归一化和标准化对比
缺失值处理
from sklearn.impute import SimpleImputer # 0.22版本的sklearn,imputer不在preprocessing里了,而是在sklearn.impute里
import numpy as np
def im():
"""
缺失值处理
:return:NOne
"""
# NaN, nan
im = SimpleImputer(strategy='mean')
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
输出:[[1. 2.]
[4. 3.]
[7. 6.]]
1.3 数据的降维之特征选择
什么是特征选择?
from sklearn.feature_selection import VarianceThreshold
def var():
"""
特征选择-删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=1.0) # 删除方差默认值为threshold=0.0
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
输出:[[0]
[4]
[1]]
PCA是什么?
特征数据达到上百时,就要考虑要不要用PCA简化数据。当然数据也会改变,特征数据也会减少。
高纬度数据容易出现的问题:
1.特征之间通常是相关的。
PCA如何将一个二维数据简化为一维数据
详细说明请详看机器学习之PCA主成分分析博客
from sklearn.decomposition import PCA
def pca():
"""
主成分分析进行特征降维
:return: None
"""
pca = PCA(n_components=0.9) # 保存90%,如果为整数则为减少到的特征数量
data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
print(data)
return None
if __name__ == "__main__":
pca()
输出:[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]