一、机器学习简介和概述:
1.影响人工智能的发展:数据和算法
2.分类:(1)自然语言处理:自动报到天气的程序,写新闻
(2)图像识别:人脸识别,图片优化
(3)传统预测:信贷需求预测,店铺销量预测
3.机器学习是:从数据中自动分析获得规律,并利用这些规律对未知数据进行预测。
比如说:AlphaGo(从棋谱中学习数据,打败柯洁)、广告搜索:根据历史行为推荐商品
4.为什么需要机器学习:解放生产力(智能客服)、解决专业问题(ET医疗)、提供社会便利(城市大脑)
5.机器学习的价值:领域需要多,让机器学习程序替代手动的步骤,减少企业的成本也提高企业的效率。
二、特征工程和文本提取
1.数据集的组成
机器学习的数据:文件csv,使用pandas读取数据处理数据,基于numpy
numpy为什么处理速度很快?c编写,GIL锁释放可以进行多线程操作
2.数据集的结构:
数据集:kaggle uci scikit-learn
结构:特征值+目标值
比如说:利用身高、体重、皮肤颜色、头发长度等判断男女
{特征值:身高、体重、皮肤、头发长度 目标值:男、女}
注:有些数据集可以没有目标值
3.特征工程是什么?
提高数据预测的效果
意义:直接影响预测结果
特征抽取:文本、字符串进行特征值化
4.字典特征抽取
作用:对字典数据进行特征化
字典特征抽取API:sklearn.feature_extraction.DicVectorizer
方法:fit_transform(x) x:字典包含字典迭代器
流程:(1)实例化类:DicVectorizer
(2)调用fit_transform方法输入数据并转换(注意返回格式)
使用scipy工具,sparse矩阵(稀疏矩阵);作用:节约内存,方便读取处理
def dictvec():
'''
字典特征抽取
:return:
'''
# 实例化
dict = DictVectorizer(sparse=False)
# 使用fit_transform
data = dict.fit_transform([{
'city':'北京','temperature':100
},{
'city':'上海','temperature':60
},{
'city': '深圳', 'temperature': 30
}
])
print(dict.get_feature_names())
print(data)
return None
# 结果:
# ['city=上海', 'city=北京', 'city=深圳', 'temperature']
# [[ 0. 1. 0. 100.]
# [ 1. 0. 0. 60.]
# [ 0. 0. 1. 30.]]
目的:把字典中一些类别的数据,分别进行转换成特征
处理完数据像one-hot编码
5.文本特征抽取
作用:对文本数据进行特征值化
文本特征抽取API:sklearn.feature_extraction.text.CountVectorizer
返回词频矩阵
对于单个英文字母不统计的原因是一个字母没有分类的依据
def countvec():
'''
对文本进行特征值化:
1.统计文章中所有的词,重复的只看做一次
2.针对列表把每篇文章,在词的列表里面进行统计每个词出现的次数
单个字母不统计
:return:
'''
cv = CountVectorizer()
data = cv.fit_transform(
["life is short,i like like python","life is too long,i dislike python"]
)
print(cv.get_feature_names())
print(data_zh.toarray())
return None
# 结果:
# ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
# [[0 1 1 2 0 1 1 0]
# [1 1 1 0 1 1 0 1]]
对于中文:汉字以空格分开,就可以统计词,所以要先分词
分词用jieba分词
def cut_word():
word1 = jieba.cut("今天天气很好")
word2 = jieba.cut("明天天气很好")
# 转换成列表 生成器-》列表
content1 = list(word1)
content2 = list(word2)
# 列表转换成字符串
c1 = " ".join(content1)
c2 = " ".join(content2)
return c1,c2
def hanzivec():
'''
中文特征值化
:return:
'''
c1,c2 = cut_word()
print(c1,c2)
cv = CountVectorizer()
data = cv.fit_transform([c1,c2])
print(cv.get_feature_names())
print(data.toarray())
return None
# 结果:
# ['今天天气', '天气', '明天']
# [[1 0 0]
# [0 1 1]]
6.词语占比(tf-idf)
思想:如果某个词或词语在一篇文章中出现的概率高,并且在其它文章中很少出现,认为此词或短语具有很好的类别区分能力,适合用来分类
作用:评估一字词对于一个文件集或语料库中其中一份文件的重要程度。
tf:term frequency 词的频率 出现的次数
idf:逆文档频率 log(总文档数量/该词出现的文档数) log输入的数值越小,结果越小
tf*idf --重要性程度
词语占比API:sklearn.feature_extraction.text.CountVectorizer.TfidfVectorizer
得到的值就是每个词语在文章中的重要性
tf-idf:API:sklearn.feature_extraction.text.TfidfVectorizer
def tfidfvec():
'''
中文重要程度
:return:
'''
c1,c2 = cut_word()
print(c1,c2)
tf = TfidfVectorizer()
data = tf.fit_transform([c1,c2])
print(tf.get_feature_names())
print(data.toarray())
return None
# 结果:
# ['今天天气', '天气', '明天']
# [[1. 0. 0. ]
# [0. 0.70710678 0.70710678]]
特征预处理
1.了解特征预处理
通过特定的统计方法将数据准换成算法要求的数据。
数值型数据:
标准缩放:(1)归一化(2)标准化
类别性数据:one-hot编码
时间类型:时间的切分
API:sklearn.preprocessing
2.归一化
特点:通过对原始数据进行变换把数据映射到(0,1)之间
公式:x’ = x-min/max-min x’’ = x’ * (mx-mi)+mi
作用于每一列,max为一列的最大值,min为一列的最小值
x’'为最终结果,mx、mi分别为指定区间值默认mx为1
其实就是将大的数据缩放到0-1之间
归一化API:sklearn.preprocessing.MinMaxScaler
语法:
def mm():
'''
归一化处理
:return:None
'''
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
# [[3. 2. 2. 2. ]
# [2. 3. 3. 2.83333333]
# [2.5 2.5 2.6 3. ]]
三个特征同等重要的时候,进行归一化,使得一个特征对最终结果不会造成更大的影响。
缺点:异常点较多会让最大最小值会影响,鲁棒性较差,会影响效果,适合传统精确小数据场景。
3.标准化:
特点:通过对原始数据进行变换,把数据变换到均值为0,标准差为1的范围内。
作用于每一列
方差大小表示数据的离散性,大就比较离散
解决了归一化异常点问题,对于具有一定量的数据,少量的异常点对于平均值的影响并不大
特征化API:sklearn.preprocessing.StandardScaler
语法:
def stand():
'''
标准化缩放
:return:
'''
std = StandardScaler()
data = std.fit_transform([[1.,-1.,3.],[2.,4.,2.],[4.,6.,-1.]])
print(data)
# [[-1.06904497 -1.35873244 0.98058068]
# [-0.26726124 0.33968311 0.39223227]
# [ 1.33630621 1.01904933 -1.37281295]]
在样本比较多的情况下比较稳定
4.缺失值处理:
删除或填补,一般选择插补(平均值、中位数等)
缺失值API:sklearn.preprocessing.Imputer
pandas处理数据使用dropna,fillna 数据中的缺失值:np.nan 可以把指定想要补充的值使用replace函数填成np.nan进行处理
def im():
'''
缺失值处理
:return:
'''
# NAN,nan
imputer = SimpleImputer(missing_values=NA,strategy="mean")
data = imputer.fit_transform([[1,2],[NA,3],[7,6]])
print(data)
# [[1. 2.]
# [4. 3.]
# [7. 6.]]