人工智能学习课程安排

机器学习 三天
深度学习 三天
量化交易 四天

机器学习三天课程安排

机器学习概述、特征工程         1天
分类算法                      1天
回归算法、聚类                 1天
课程目标:
 - 应用Scikit-learn实现数据集的特征工程 
 - 掌握机器学习常见算法原理
 - 应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题

一、机器学习day01(概述)

1.1 人工智能概述

1.1.1 人工智能、机器学习、深度学习关系

在这里插入图片描述

   机器学习是人工智能的一个实现途径
   深度学习是机器学习的一个方法发展而来
   达特茅斯会议-人工智能的起点

1.1.2 机器学习、深度学习能做些什么

        传统预测
        图像识别
        自然语言处理

1.2 什么是机器学习

**从数据中自动分析获得模型,并利用模型对未知数据进行预测**

在这里插入图片描述

**从历史数据当中获得规律?这些历史数据是怎么的格式?**
  数据集构成:特征值 + 目标值

在这里插入图片描述
在这里插入图片描述

1.3 机器学习算法分类

在这里插入图片描述

   监督学习(输入特征值和目标值)
        目标值:类别 - 分类问题
            k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归
        目标值:连续型的数据 - 回归问题
            线性回归、岭回归
   无监督学习(输入特征值)
        目标值:无 
             聚类 k-means
    1、预测明天的气温是多少度? 回归
    2、预测明天是阴、晴还是雨? 分类
    3、人脸年龄预测? 回归/分类
    4、人脸识别? 分类

1.4 机器学习开发流程

    1)获取数据
    2)数据处理
    3)特征工程
    4)机器学习算法训练 - 模型
    5)模型评估
    6)应用

1.5 学习框架和资料介绍

    1)算法是核心,数据与计算是基础
    2)找准定位
    		分析很多的数据
			分析具体的业务
			应用常见的算法
			特征工程、调参数、优化
    3)怎么做?
        1、入门
	            学会分析问题,使用机器学习算法的目的:想要算法完成何种任务
				掌握算法基本思想,学会对问题用相应的算法解决
				学会利用库或者框架解决问题(pytorch、sklearn、......)
        2、实战类书籍
	          	   机器学习 -”西瓜书”- 周志华......
	               统计学习方法 - 李航
	               深度学习 - “花书”

二、机器学习day01(特征工程)

	    了解特征工程在机器学习当中的重要性
		应用sklearn实现特征预处理
		应用sklearn实现特征抽取
		应用sklearn实现特征选择
		应用PCA实现特征的降维

2.1 数据集

     数据集分为训练集和测试集
     这个教程主要讲解sklearn数据集

2.1.1 可用数据集

        公司内部 百度
        数据接口 花钱
        学习数据集:
            1)sklearn
            2)kaggle
            3)UCI

2.1.2 sklearn数据集

		  1 Scikit-learn工具介绍
					Python语言的机器学习工具
					Scikit-learn包括许多知名的机器学习算法的实现
					Scikit-learn文档完善,容易上手,丰富的API
		  2 安装(需要Numpy Scipy等库)
					pip install Scikit-learn==0.19.1
					import sklearn
		  3 内容
				    分类、聚类、回归
				    特征工程
					模型选择、调优 
		  4 API
        	sklearn.datasets
            	加载数据集
           	        datasets.load_*  获取小规模数据集
           	        	鸢尾花:sklearn.datasets.load_iris()
           	        	波士顿房价:sklearn.datasets.load_boston()
            		datasets.fetch_* 获取大规模数据集
            			sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
		  5 数据集使用
			数据集返回的数据类型 datasets.base.Bunch(继承自字典)
                    dict["key"] = values
                    bunch.key = values
			data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
			target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
			DESCR:数据描述
			feature_names:特征名,新闻数据,手写数字、回归数据集没有
			target_names:标签名
from sklearn.datasets import load_iris 						 //获取数据集需要导入
from sklearn.model_selection import train_test_split 		//数据集划分导入
# 数据集使用
def dataset_demo():
  
    #1.获取数据集
    iris=load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集描述:\n",iris["DESCR"])
    print("查看特征的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data,iris.data.shape)
    print("鸢尾花目标值类别:\n",iris.target_names)
    print("鸢尾花目标值:\n",iris.target)
    print("鸢尾花的描述:\n",iris.DESCR)
    
    #2.数据集划分
    x_train,x_text,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
    print("训练集的特征值:\n",x_train,x_train.shape)
    return None
       数据集的划分
        训练数据:用于训练,构建模型
        测试数据:在模型检验时使用,用于评估模型是否有效  20%~30%
        API:x_train,     x_test,      y_train,     y_test    =sklearn.model_selection.train_test_split(arrays, *options)
            训练集特征值,测试集特征值,训练集目标值,测试集目标值
	    x 数据集的特征值
		y 数据集的标签值
		test_size 测试集的大小,一般为float
		random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
		return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)

2.2 特征工程介绍

    目标:
		了解特征工程在机器学习当中的重要性
		知道特征工程的分类

2.2.1 为什么需要特征工程(Feature Engineering)

   		  数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

2.2.2 什么是特征工程

    	  是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程

2.2.3 如何进行特征工程

            sklearn
            pandas (用于数据清洗、数据处理)

2.2.4 特征工程包含

            特征抽取/特征提取
            特征预处理
            特征降维

2.3 特征提取/特征提取

2.3.1 什么是特征提取(将文本或者类别 用数值表示 以便计算机能更好理解)

	 	 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
			 	 字典特征提取(特征离散化)
				 文本特征提取
				 图像特征提取(深度学习将介绍

在这里插入图片描述
在这里插入图片描述

      API: sklearn.feature_extraction

2.3.2 字典特征提取案例

实例化:sklearn.feature_extraction.DictVectorizer(sparse=True,…)
调用:DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
	  DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
	  DictVectorizer.get_feature_names() 返回类别名称

在这里插入图片描述
在这里插入图片描述

from sklearn.feature_extraction import DictVectorizer
# 字典特征抽取
def dict_demo():
    data=[{'city':'北京','temperature':'100'},{'city':'上海','temperature':'60'},{'city':'深圳','temperature':'30'}]
    # 1、实例化转换器类  (sparse意为稀疏矩阵)
    transfer=DictVectorizer()
    # 2、调用fit_transform()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return None

上述代码输出稀疏矩阵:
在这里插入图片描述

# 字典特征抽取
def dict_demo():
    data=[{'city':'北京','temperature':'100'},{'city':'上海','temperature':'60'},{'city':'深圳','temperature':'30'}]
    # 1、实例化转换器类  (sparse稀疏矩阵)
    transfer=DictVectorizer(sparse=False)
    # 2、调用fit_transform()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    print("特征名字:\n",transfer.get_feature_names_out())
    return None    

上述代码取消稀疏矩阵,转化为矩阵
在这里插入图片描述

   应用场景:
   1)pclass, sex 数据集当中类别特征比较多
                            1、先将数据集的特征->字典类型
                            2、DictVectorizer转换(上述代码块)
   2)本身拿到的数据就是字典类型

2.3.3 文本特征提取

                    单词 作为 特征
                    句子、短语、字母------>不适合作为特征
                    并不是分词后所有的单词都能作为特征,部分特征词是特征
方法1:CountVectorizer
                   		作用:对文本数据进行特征值化(统计每个样本特征词出现的个数)
						·sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) 返回词频矩阵
						·CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
						·CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
						·CountVectorizer.get_feature_names() 返回值:单词列表

英文文本 示例:

from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
    data=["life is short ,i like like python","life is too long,i dislike python"]
    transfer=CountVectorizer()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return None
count_demo()
data_new:
   (0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	2
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1
def count_demo():
    data=["life is short ,i like like python","life is too long,i dislike python"]
    transfer=CountVectorizer()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new.toarray())
    return None
count_demo()
data_new:
 [[0 1 1 2 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
                        stop_words停用词功能,可参考停用词表

中文文本 示例:

pip install jieba
import jieba
def cut_word(text):
    #进行中文分词函数
    text=" ".join(list(jieba.cut(text)))
    return text
def count_chinese_demo():
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到字宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent)) 
    transfer=CountVectorizer()
    data_final=transfer.fit_transform(data_new)
    print("data_new:\n",data_final)
    return None
data="我爱北京天安门"
print(cut_word(data))

在这里插入图片描述

count_chinese_demo()

在这里插入图片描述

def count_chinese_demo():
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到字宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent)) 
    transfer=CountVectorizer()
    data_final=transfer.fit_transform(data_new)
    print("data_new:\n",data_final.toarray())
    print("特征名字:\n",transfer.get_feature_names_out())
    return None
count_chinese_demo()

在这里插入图片描述

def count_chinese_demo():
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到字宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent)) 
    transfer=CountVectorizer(stop_words=["一种","所以"])
    data_final=transfer.fit_transform(data_new)
    print("data_new:\n",data_final.toarray())
    print("特征名字:\n",transfer.get_feature_names_out())
    return None
count_chinese_demo()

在这里插入图片描述

					#上述矩阵出现了4和3的大数值,需要评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。----->ifidf

                    关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
方法2:TfidfVectorizer
                        TF-IDF - 重要程度
                        两个词 “经济”,“非常”
                        1000篇文章-语料库
                        100篇文章 - "非常"
                        10篇文章 - “经济”
                        两篇文章
                        文章A(100词) : 10次“经济” TF-IDF:0.2
                            tf:10/100 = 0.1
                            idf:lg 1000/10 = 2
                        文章B(100词) : 10次“非常” TF-IDF:0.1
                            tf:10/100 = 0.1
                            idf: log 10 1000/100 = 1
                            对数?
                                2 ^ 3 = 8
                                log 2 8 = 3
                                log 10 10 = 1
                        TF - 词频(term frequency,tf)
                        IDF - 逆向文档频率
from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_demo():
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到字宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent)) 
    transfer=TfidfVectorizer(stop_words=["一种","所以"])
    data_final=transfer.fit_transform(data_new)
    print("data_new:\n",data_final.toarray())
    print("特征名字:\n",transfer.get_feature_names_out())
    return None
tfidf_demo()

在这里插入图片描述

2.4特征预处理

2.4.1 什么是特征预处理

                :通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程(归一化/标准化)
                为什么我们要进行归一化/标准化?(使得特征同等重要)
                即无量纲化,使不同规格的数据转换到同一规格。
               API:sklearn.preprocessing

2.4.2 归一化

                        异常值:最大值、最小值

在这里插入图片描述

		sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
		MinMaxScalar.fit_transform(X)
		X:numpy array格式的数据[n_samples,n_features]
		返回值:转换后的形状相同的array
示例:
import pandas as pd
#用来读取文件
from sklearn.preprocessing import MinMaxScaler
def MinMax_demo():
    #归一化函数
    
    #1.读取数据
    data=pd.read_csv("D:/anaconda/JupyterNotebook/dating.txt")
    data=data.iloc[:,:3]
    
    #2.实例化一个转换器类
    transfer=MinMaxScaler(feature_range=(2,3))
    #3.调用归一化函数
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return None
MinMax_demo()

在这里插入图片描述

2.4.3 标准化

    由于异常点大概率是最大值最小值,会影响归一化的鲁棒性,所以引入标准化
    X`= (x - mean) / std
    标准差:集中程度
    应用场景: 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
		sklearn.preprocessing.StandardScaler( )
		处理之后每列来说所有数据都聚集在均值0附近标准差差为1
		StandardScaler.fit_transform(X)
		X:numpy array格式的数据[n_samples,n_features]
		返回值:转换后的形状相同的array
示例:
from sklearn.preprocessing import StandardScaler
def Stand_demo():
    #归一化函数
    
    #1.读取数据
    data=pd.read_csv("D:/anaconda/JupyterNotebook/dating.txt")
    data=data.iloc[:,:3]
    
    #2.实例化一个转换器类
    transfer=StandardScaler()
    #3.调用归一化函数
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return None
Stand_demo()

在这里插入图片描述

2.5特征降维

2.5.1 降维 - 降低维度

                        ndarray
                            维数:嵌套的层数
                            0维 标量
                            1维 向量
                            2维 矩阵
                            3维
                            n维
                   降维的对象: 二维数组
                   此处的降维:降低特征的个数
                   效果: 特征与特征之间不相关
                   (正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大

2.5.2 降维的两种方式

特征选择
                        Filter过滤式
                            方差选择法:低方差特征过滤
from sklearn.feature_selection import VarianceThreshold
def Variance_demo():
    #过滤低方差特征
    
    #1.读取数据
    data=pd.read_csv("D:/anaconda/JupyterNotebook/data/factor_returns.csv")
    data=data.iloc[:,1:-2]
#     print("data:\n",data)
    #2.实例化一个转换器类
    transfer=VarianceThreshold()
    #3.调用归一化函数
    data_new=transfer.fit_transform(data)
    #因为返回的是ndarray 所以可以使用.shape查看大小
    print("data_new:\n",data_new,data_new.shape)
    r=pearsonr(data["pe_ratio"],data["pb_ratio"])
    print("相关系数:\n",r)
    return None
Variance_demo()

在这里插入图片描述

                            相关系数 - 特征与特征之间的相关程度
from scipy.stats import pearsonr
#其余同上
                                取值范围:–1≤ r ≤+1
                                皮尔逊相关系数
                                特征与特征之间相关性很高:
                                    1)选取其中一个
                                    2)加权求和
                                    3)主成分分析
                        Embeded嵌入式
                            决策树 第二天
                            正则化 第三天
                            深度学习 第五天
主成分分析

2.6.1 什么是主成分分析(PCA)

                            sklearn.decomposition.PCA(n_components=None)
                            n_components
                                小数 表示保留百分之多少的信息
                                整数 减少到多少特征
from sklearn.decomposition import PCA
def pca_demo():
    #pca降维
    data=[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
    #1.实例化转换器类
    transfer=PCA(n_components=0.95)
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    return None
pca_demo()

在这里插入图片描述

2.6.2 案例:探究用户对物品类别的喜好细分

                            用户          物品类别
                            user_id         aisle
                            1)需要将user_id和aisle放在同一个表中 - 合并
                            2)找到user_id和aisle - 交叉表和透视表
                            3)特征冗余过多 -> PCA降维
#获取数据
order_products__prior=pd.read_csv("D:/anaconda/JupyterNotebook/data/instacart/order_products__prior.csv")
orders=pd.read_csv("D:/anaconda/JupyterNotebook/data/instacart/orders.csv")
products=pd.read_csv("D:/anaconda/JupyterNotebook/data/instacart/products.csv")
aisles=pd.read_csv("D:/anaconda/JupyterNotebook/data/instacart/aisles.csv")
order_products__prior.csv:订单与商品信息
    字段:order_id, product_id, add_to_cart_order, reordered
products.csv:商品信息
    字段:product_id, product_name, aisle_id, department_id
orders.csv:用户的订单信息
    字段:order_id,user_id,eval_set,order_number,.
aisles.csv:商品所属具体物品类别
    字段: aisle_id, aisle
#合并数据
tab1=pd.merge(aisles,products,on=["aisle_id","aisle_id"])
tab2=pd.merge(tab1,order_products__prior,on=["product_id","product_id"])
tab2=pd.merge(tab2,order_products__prior,on=["order_id","order_id"])
# 3、交叉表处理,把user_id和aisle进行分组
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
# 4、主成分分析的方法进行降维
# 1)实例化一个转换器类PCA
transfer = PCA(n_components=0.95)
# 2)fit_transform
data = transfer.fit_transform(table)
data.shape

(206209, 44)

示例:
在这里插入图片描述

import pandas as pd
from scipy.stats import chi2_contingency

# 假设 tab3 是您的 DataFrame
tab3 = pd.DataFrame({
    'user_id': [1, 1, 2, 1],
    'order_id': [1001, 1001, 1002, 1003],
    'product_id': [5001, 5002, 5003, 5004],
    'product_name': ['Milk', 'Bread', 'Eggs', 'Apple'],
    'aisle': [1, 2, 7, 10]
})

# 创建列联表
contingency_table = pd.crosstab(tab3['user_id'], tab3['aisle'])

# 计算卡方统计量
chi2, p, dof, expected = chi2_contingency(contingency_table)

# 输出列联表和卡方统计量
print("列联表:\n", contingency_table)
print("\n卡方统计量:", chi2)
print("P-value:", p)

在这里插入图片描述

列联表:显示每个 user_id 在每个 aisle 中的频数。

总结

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐