图灵 人工智能之父
马文 李 闵斯基 对人工智能有突出贡献
机器学习: 比如说过滤一些邮件
深度学习: 识别猫的样子等等
计算能力和数据大小还有算法的发展影响人工智能的发展
机器学习深度学习做什么?
包括:
机器学习课程:
什么是机器学习?
机器学习是从数据中自动分析获得规律(模型),并利用规律进行未知数据进行预测。
为什么需要机器学习?
领域:医疗 航空 教育 物流 电商
目的:让机器学习程序替代手动的步骤,减少企业的成本也提高企业的效率
从历史数据收集规律,一般是文件csv
mysql不用,原因:
pandas:可以直接读取数据,基于numpy:动态语言 释放GIL(锁) 四个线程 真正的多线程
构成:
pandas: 一个数据读取数据非常方便以及基本的格式处理格式的工具
sklearn: 对于特征的处理提供了强大的接口
特征工程
就是将原始数据转换成更好的代表预测模型潜在问题的特征的过程,从而提高了对未知数据的预测准确性。
sklearn
特征抽取API结论 : 特征抽取对文本数据
进行特征值化
作用 : 对字典数据
进行特征值化
特征抽取API: sklearn.feature_extraction.DictVectorizer
DictVectorizer(sparse = True,…)
DictVectorizer.fit_transform(X)
DictVectorizer.inverse_transform(X)
DictVectorizer.get_feature_names)
DictVectorizer.transform(X)
code举例:
# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
'''字典抽取'''
# 实例化
dict = DictVectorizer()
# 调用fit_transform
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(data)
return None
if __name__ == "__main__":
dictvec()
输出:
(0, 1) 1.0 # 节约内存 方便读取处理
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
code2:
# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
'''字典抽取'''
# 实例化
dict = DictVectorizer(sparse = False) # 指定False的话
# 调用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
if __name__ == "__main__":
dictvec()
输出:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
矩阵 ndarray的类型 维度是2 二维数组
one-hot编码
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
字典数据抽取: 把字典中一些类别的数据,分别转换成特征
[‘city=上海’, ‘city=北京’, ‘city=深圳’, ‘temperature’]
数组形式的话 有类别的这些特征 先转换成字典数据 再进行抽取
one-hot编码
我们做的是为每个类别生成一个布尔值,这些列中只有一列可以为每个样本取值为1,因此,术语一个热编码
作用: 对文本数据进行特征值化
类: skearn.feature_extraction.text.CountVectorize
def countvec():
'''对文本进行特征值化'''
cv = CountVectorizer()
data = cv.fit_transform(["hello world",'hello china hello puyang hello guosihan'])
print(data.toarray()) # 数字代表的是统计次数
print(cv.get_feature_names()) # 统计所有文章当中没有出现的重复的词 也就是重复的只看做一次
return None
if __name__ == "__main__":
# dictvec()
countvec()
输出:
[[0 0 1 0 1]
[1 1 3 1 0]]
['china', 'guosihan', 'hello', 'puyang', 'world']
注意:
code:
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():
'''中文特征值化'''
cv = CountVectorizer()
c1,c2,c3 = cutword()
data = cv.fit_transform([c1,c2,c3])
print(data.toarray()) # 数字代表的是统计次数
print(cv.get_feature_names())
return None
if __name__ == "__main__":
# dictvec()
hanzivec()
输出:
[[0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0]
[0 0 1 0 1 0 0 1 1 1 0 2 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 3 0 0 1]
[1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0]]
['一个', '一点', '不服', '不要', '之心', '今天', '体会', '信服', '做到', '别学', '境界', '学习', '就要', '开始', '慢慢', '所以', '才能', '执行', '折扣', '放弃', '敬畏', '明天', '残酷', '照着', '知识', '练习', '美好', '老师', '达到', '过程', '首先']
Tf
: term frequency 词的频率
idf
: 逆文档频率 inverse document frequency 出现的次数 log(总文档数量/该词出现的文档数)
注: log(数值): 输入的数值越小 结果越小
tf * idf 称之为 重要性
tf-df主要思想: 如果某个词或者短语在一篇文章中出现的频率比较高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
作用: 用以评估一个词对于一个文件集或者一个语料库中的其中一份文件的重要程度。
def tfidfvec(): # 调查词汇的重要性
c1,c2,c3 = cutword()
print(c1,c2,c3)
tf = TfidfVectorizer()
tf = tf.fit_transform([c1,c2,c3])
print(tf.toarray()) # 数字代表的是统计次数
print(tf.get_feature_names())
return None
if __name__ == "__main__":
# dictvec()
# hanzivec()
tfidfvec()
输出:
今天 很 残酷 , 明天 很 美好 , 所以 不要 放弃 刚 开始 学习 , 首先 要 做到 对 老师 和 知识 的 “ 敬畏 之心 ” 。 学习 就要 先 信服 老师 , 不服 老师 就 别学 所以 , 刚 开始 , 你 要 照着 老师 说 的 , 不 打 一点 折扣 的 去 执行 , 在 练习 的 过程 中 慢慢 体会 , 才能 达到 下 一个 “ 破 ” 的 境界
[[0. 0. 0. 0.38988801 0. 0.38988801
0. 0. 0. 0. 0. 0.
0. 0. 0. 0.29651988 0. 0.
0. 0.38988801 0. 0.38988801 0.38988801 0.
0. 0. 0.38988801 0. 0. 0.
0. ]
[0. 0. 0.23073104 0. 0.23073104 0.
0. 0.23073104 0.23073104 0.23073104 0. 0.46146208
0.23073104 0.1754769 0. 0. 0. 0.
0. 0. 0.23073104 0. 0. 0.
0.23073104 0. 0. 0.52643071 0. 0.
0.23073104]
[0.26982522 0.26982522 0. 0. 0. 0.
0.26982522 0. 0. 0. 0.26982522 0.
0. 0.20520903 0.26982522 0.20520903 0.26982522 0.26982522
0.26982522 0. 0. 0. 0. 0.26982522
0. 0.26982522 0. 0.20520903 0.26982522 0.26982522
0. ]]
特征预处理就是通过特定的统计方法(数学方法)将数据转换成算法要求的数据
对数值型数据: 标准缩放
one-hot编码
时间的切分
sklearn
特征预处理API
sklearn.preprocessing
归一化特点: 通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:
X’’ = X’ * (mx - mi) + mi
注: 作用于每一列,max为一列的最大值,min为一列的最小值,那么X’‘为最终结果,mxmi分别为指定区间默认mx为1,mi为0.
MinMaxScalar语法
MinMaxScalar(feature_range = (0,1)...)
MinMaxScalar.fit_transform(X)
code:
def mm():
'''归一化处理'''
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
if __name__ == "__main__":
# dictvec()
# hanzivec()
# tfidfvec()
mm()
输出:
[[3. 2. 2. 2. ]
[2. 3. 3. 2.83333333]
[2.5 2.5 2.6 3. ]]
如果一组数据中三个特征同样重要时候,要进行归一化处理。
归一化目的: 使得某一个特征对最终结果不会造成更大的影响
异常点对最大值最小值影响太大
归一化总结: 注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
注:异常点对标准化影响不大,但是是在一定数据量之上影响不大,从而方差改变较小。
skearn特征化API
def stand():
'''标准化缩放'''
std = StandardScaler()
data = std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
print(data)
return None
if __name__ == "__main__":
# dictvec()
# hanzivec()
# tfidfvec()
# mm()
stand()
(标准化)输出:
[[-1.06904497 -1.35873244 0.98058068]
[-0.26726124 0.33968311 0.39223227]
[ 1.33630621 1.01904933 -1.37281295]]
标准化总结:
在已有的样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
如何处理数据中的缺失值:
一般不建议删除 建议去插补 平均值和中位数之类的来填补
sklearn填补API: sklearn.preprocessing.Imputer
Imputer流程
code:
def imp():
'''缺失值处理'''
im = Imputer(missing_values= 'NaN',strategy='mean',axis=0) # 用平均值去填补 axis = 0 是按列
data = im.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__ == "__main__":
# dictvec()
# hanzivec()
# tfidfvec()
# mm()
# stand()
imp()
输出:
[[1. 2.]
[4. 3.]
[7. 6.]]