一、人工智能概述
-
机器学习、深度学习、人工智能的关系
机器学习是人工智能的一个实现途径
深度学习是机器学习的一个方法发展而来(机器学习包括传统的学习和深度学习)
-
机器学习可以做什么
传统预测 图像识别 自然语言处理
二、什么是机器学习
模型是核心,通过历史数据进行训练,然后输入新的数据可以产生输出
—类似于我们人类获取经验归纳得出规律或者结论,然后遇到新的问题产生解决方案
模型+数据+预测
三、机器学习算法分类
数据集构成:特征值+目标值 一行成为一个样本 可能没有目标值
有监督学习: 有目标值 如:分类 回归
目标值:类别—分类问题:k-近邻算法、贝叶斯回归、决策树与随机森林、逻辑回归
目标值:连续型数据—回归问题:线性回归、岭回归
无监督学习: 无目标值 如: 聚类:k-means
四、机器学习开发流程
输入数据—>数据预处理—>特征工程—>机器学习算法训练(模型)—>模型评估—>应用
如果模型评估效果不好,则转向数据预处理步,继续执行
学习框架:算法是核心,数据与计算是基础
tensrflow pthorch caffe2 chainer
特征工程
一、可用数据集
-
Scikit-learn
特点:数据量较小,方便学习
-
Kaggle:
特点:大数据竞赛平台、80万科学家、真实数据、数据量巨大
-
UCI
特点:依托高校、领域广、数据量大
二、sklearn数据集
-
API介绍
sklearn.datasets 加载获取流行数据集
datasets.load_*() 获取小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home=None)
获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/
-
小数据集介绍
sklearn.datasets.load_iris()加载并返回莺尾花数据集
包括3个类别、4个特征、150个样本数量
sklearn.datasets.load_boston()加载并返回波士顿房价数据集
包括5-50个目标类别,13个特征,506个样本数量
-
大数据集介绍
sklearn.datasets.fetch_20newsgroups(data_home=None,subset='train')
data_home就是数据集所在目录,默认是~/scikit_learn_data/
subset:'train'就是只加载训练集,all就是训练集和测试集都加载
机器学习数据集划分为两个部分:
训练数据集:用于训练,构建模型
测试数据集:在模型检验时使用,评估模型是否有效
划分比例:
训练集:70% 80% 75%
测试集:30% 20% 30%
数据集划分API
sklearn.model_selection.train_test_split(arrays,*options)
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split def datasets_demo(): """ sklearn数据集使用 :return; """ #获取数据集 iris = load_iris() #print("莺尾花数据集\n",iris) #print("查看数据描述\n",iris["DESCR"]) #print("查看特征值名字\n",iris.feature_names) #数据集划分 x_train,x_test,y_train,y_text = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22) #x数据的特征值,y数据的标签值,test_size 测试集的大小,一般为float,random_state,随机数种子,不同的种子会造成不同的随机采样结果 #return 训练集特征值,测试集特征值,训练集目标值,测试集目标值 return None if __name__=="__main__": #代码1:sklearn数据集使用 datasets_demo()
三、特征工程
-
为什么需要特征工程?
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
-
什么是特征工程?
定义:特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好作用的过程
意义:会直接影响机器学习的效果
-
特征工程的位置与数据处理比较
sklearn:特征工程
pandas:数据清洗,数据处理
特征工程包含内容:
特征提取
机器学习算法就是最初搞统计的人做的,所以机器学习方法也是统计算法:数学公式
目的:将数据转换成数值类型:文本—数值/类型—数值(转换成onehot编码或者哑变量)
-
分类:字典特征提取 文本特征提取 图像特征提取
-
特征提取API:sklearn.feature_extraction
###字典特征提取 from sklearn.feature_extraction import DictVectorizer def dict_demo(): """ 字典特征抽取 Returns ------- None. """ data = [{'city':'北京','temperature':100},{'city':'上海','temprature':100},{'city':'深圳','temprature':30}] #1.实例化一个转换器类 transfer = DictVectorizer(sparse=False) #2.调用fit_transform,fit_transform(X)X:字典或者包含字典的迭代器返回值,返回sparse(稀疏)矩阵 #inverse_transform(X)X:array数组或者sparse矩阵,返回转换之前的数据格式 data_new = transfer.fit_transform(data) print("data_new:\n",data_new) #get_feature_names返回类别名称 print("特征名字:\n",transfer.get_feature_names()) return None
-
输出: ```python data_new: [[ 0. 1. 0. 100. 0.] [ 1. 0. 0. 0. 100.] [ 0. 0. 1. 0. 30.]] 特征名字: ['city=上海', 'city=北京', 'city=深圳', 'temperature', 'temprature']
###文本特征提取 def count_dome(): """ 文本特征抽取 Returns ------- None. """ data=["life is short,i like python","life is too long,i dislike python"] #1.实例化一个转化器类 transfer = CountVectorizer() #2.调用fit_transform data_new = transfer.fit_transform(data) #print("data_new:\n",data_new) #打印二维数组形式 print("data_new:\n",data_new.toarray()) print("特征名字:\n",transfer.get_feature_names) return None
输出: ```python data_new: [[0 1 1 1 0 1 1 0] [1 1 1 0 1 1 0 1]] 特征名字: ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too'] ``` 问题:中文怎样提取? 1. 加空格: ```python data=["我 爱 北京 天安门","天安门 上 太阳 升"] ``` 但是如果字数很多怎么办? 2. jieba分词处理 1. 准备句子,利用jieba.cut进行分词 2. 实例化CountVectorizer 3. 将分词结果变成字符串当做fit_transform的输入值 ```python def cut_word(text): """ 进行中文分词:["我爱北京天安门"——>"我 爱 北京 天安门"] Parameters ---------- text : TYPE DESCRIPTION. Returns """ return " ".join(list(jieba.cut(text))) def count_chinese_demo2(): """ 中文文本特征抽取,自动分词 Returns ------- None. """ #1.将中文文本进行分词 data = ["春天感动了小草,小草才微笑得那样柔软。小草感动了太阳,太阳才绽放得那样灿烂。", "不要像玻璃那样脆弱。有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。", "整个世界,因为有了阳光,城市有了生机;细小心灵,因为有了阳光,内心有了舒畅。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) print(data_new) ``` 输出: ```python ['春天 感动 了 小草 , 小草 才 微笑 得 那样 柔软 。 小草 感动 了 太阳 , 太阳 才 绽放 得 那样 灿烂 。', '不要 像 玻璃 那样 脆弱 。 有 的 人 眼睛 总 盯 着 自己 , 所以 长不高 看 不远 ; 总是 喜欢 怨天尤人 , 也 使 别人 无比 厌烦 。', '整个 世界 , 因为 有 了 阳光 , 城市 有 了 生机 ; 细小 心灵 , 因为 有 了 阳光 , 内心 有 了 舒畅 。'] ``` 该如何处理某个词或短语在多篇文章中出现次数高的情况 3. Tf-idf文本特征提取 主要思想:如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词语或者短语具有很好的类别区分能力,适合用来分类 TF-IDF作用:用以评估一字词对于一个文件集或一个语料库其中一份文件的重要程度 公式: 词频(term frequency,tf)指的是一个给定的词语在该文件中出现的频率 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取以10为底的对数得到 tfidf = tf *idf 最终结果可以理解为重要程度  ```python def tfidf_demo(): """ 用tfidf进行文本特征抽取 Returns ------- None. """ data = ["春天感动了小草,小草才微笑得那样柔软。小草感动了太阳,太阳才绽放得那样灿烂。", "不要像玻璃那样脆弱。有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。", "整个世界,因为有了阳光,城市有了生机;细小心灵,因为有了阳光,内心有了舒畅。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) #print(data_new) #1.实例化一个转化器类 transfer = CountVectorizer(stop_words=("小草","有了")) #2.调用fit_transform(data_new) data_final = transfer.fit_transform(data_new) print("data_new:\n",data_final.toarray()) print("特征值名字\n",transfer.get_feature_names()) return None ``` 输出: ```python data_new: [[0 0 0 0 0 0 0 0 0 2 1 0 0 0 2 0 0 0 1 1 1 0 0 0 0 1 0 0 0 2 0 0] [1 1 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 1 1 0] [0 0 1 1 0 0 0 2 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 2]] 特征值名字 ['不要', '不远', '世界', '内心', '别人', '厌烦', '喜欢', '因为', '城市', '太阳', '微笑', '心灵', '怨天尤人', '总是', '感动', '所以', '整个', '无比', '春天', '柔软', '灿烂', '玻璃', '生机', '眼睛', '细小', '绽放', '脆弱', '自己', '舒畅', '那样', '长不高', '阳光'] ```
特征预处理
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
-
包含内容
数值型数据无量纲化:归一化 标准化,将不同规格的数据转换到统一规格
-
特征预处理API
sklearn.preprocessing
为什么我们要进行标准化/归一化?
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
-
公式:
max/min:一列的最大/小值 mx/mi:想要放缩的范围
-
数据计算
-
实例化MinMaxSclar
-
通过fit_transform转换
def minmax_demo(): """ 归一化 Returns ------- None. """ #1.获取数据 data = pd.read_csv("dating.txt") #所有行 前3列 data= data.iloc[:,:3] print("data:\n",data) #2.实例化一个转换器类 transfer = MinMaxScaler() #3.调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n",data_new) return None
输出:
data: milage Liters Consumtime 0 40920 8.326976 0.953952 1 14488 7.153469 1.673904 2 26052 1.441871 0.805124 3 75136 13.147394 0.428964 data_new: [[0.43582641 0.58819286 0.42169743] [0. 0.48794044 1. ] [0.19067405 0. 0.30215111] [1. 1. 0. ]]
-
特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量**的过程
方法:1.特征选择(从原特征中找出主要特征)
-
过滤式(方差选择法、相关系数)
def variance_demo(): """ 删除低方差特征——特征选择 :return: None """ data = pd.read_csv("factor_returns.csv") print(data) # 1、实例化一个转换器类 transfer = VarianceThreshold(threshold=1) # 2、调用fit_transform data = transfer.fit_transform(data.iloc[:, 1:10]) print("删除低方差特征的结果:\n", data) print("形状:\n", data.shape) return None
import pandas as pd from scipy.stats import pearsonr def pearsonr_demo(): """ 相关系数计算 :return: None """ data = pd.read_csv("factor_returns.csv") factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev', 'earnings_per_share', 'revenue', 'total_expense'] for i in range(len(factor)): for j in range(i, len(factor) - 1): print( "指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0])) return None
-
嵌入式(决策树、正则化、卷积等)
2.主成分分析
主成分选取原则【任一个满足即可】:
-
各主成分的累积方差贡献率>80%
-
特征值λ > 1