机器学习概述-数据集-特征工程
流程图
机器学习概述
1 服务领域:
2 定义:机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。
3 机器学习流程
流程总结
- 1.获取数据
- 2.数据基本处理
- 3.特征工程
- 4.机器学习(模型训练)
- 5.模型评估
- 结果达到要求,上线服务
- 没有达到要求,重新上面步骤
4 算法分类
- 监督学习(supervised learning)(预测)
- 定义:输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
- 分类 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
- 回归 线性回归、岭回归
- 无监督学习(unsupervised learning)
- 定义:输入数据是由输入特征值所组成。
- 聚类 k-means
数据集-特征工程
1 数据集
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets
2 特征工程
- 特征预处理
- 特征抽取
- 特征降维
3 相关代码
""" 人工智能阶段 机器学习 三天 深度学习 三天 量化交易 四天 传统的机器学习算法 机器学习概述、特征工程 1天 分类算法 1天 回归算法、聚类 1天 机器学习概述 1.1 人工智能概述 达特茅斯会议-人工智能的起点 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 1.1.2 机器学习、深度学习能做些什么 传统预测 图像识别 自然语言处理 1.2 什么是机器学习 数据 模型 预测 从历史数据当中获得规律?这些历史数据是怎么的格式? 1.2.3 数据集构成 特征值 + 目标值 1.3 机器学习算法分类 监督学习 目标值:类别 - 分类问题 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归 目标值:连续型的数据 - 回归问题 线性回归、岭回归 目标值:无 - 无监督学习 聚类 k-means 1、预测明天的气温是多少度? 回归 2、预测明天是阴、晴还是雨? 分类 3、人脸年龄预测? 回归/分类 4、人脸识别? 分类 1.4 机器学习开发流程 1)获取数据 2)数据处理 3)特征工程 4)机器学习算法训练 - 模型 5)模型评估 6)应用 1.5 学习框架和资料介绍 1)算法是核心,数据与计算是基础 2)找准定位 3)怎么做? 1、入门 2、实战类书籍 3、机器学习 -”西瓜书”- 周志华 统计学习方法 - 李航 深度学习 - “花书” 4)1.5.1 机器学习库与框架 特征工程 2.1 数据集 2.1.1 可用数据集 公司内部 百度 数据接口 花钱 数据集 学习阶段可以用的数据集: 1)sklearn 2)kaggle 3)UCI 1 Scikit-learn工具介绍 2.1.2 sklearn数据集 sklearn.datasets load_* 获取小规模数据集 fetch_* 获取大规模数据集 2 sklearn小数据集 sklearn.datasets.load_iris() 3 sklearn大数据集 sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) 4 数据集的返回值 datasets.base.Bunch(继承自字典) dict["key"] = values bunch.key = values 思考:拿到的数据是否全部都用来训练一个模型? 2.1.3 数据集的划分 训练数据:用于训练,构建模型 测试数据:在模型检验时使用,用于评估模型是否有效 测试集 20%~30% sklearn.model_selection.train_test_split(arrays, *options) 训练集特征值,测试集特征值,训练集目标值,测试集目标值 x_train, x_test, y_train, y_test 2.2 特征工程介绍 算法 特征工程 2.2.1 为什么需要特征工程(Feature Engineering) 2.2.2 什么是特征工程 sklearn 特征工程 pandas 数据清洗、数据处理 特征抽取/特征提取 机器学习算法 - 统计方法 - 数学公式 文本类型 -》 数值 类型 -》 数值 2.3.1 特征提取 sklearn.feature_extraction 2.3.2 字典特征提取 - 类别 -> one-hot编码 sklearn.feature_extraction.DictVectorizer(sparse=True,…) vector 数学:向量 物理:矢量 矩阵 matrix 二维数组 向量 vector 一维数组 父类:转换器类 返回sparse矩阵 sparse稀疏 将非零值 按位置表示出来 节省内存 - 提高加载效率 应用场景: 1)pclass, sex 数据集当中类别特征比较多 1、将数据集的特征-》字典类型 2、DictVectorizer转换 2)本身拿到的数据就是字典类型 2.3.3 文本特征提取 单词 作为 特征 句子、短语、单词、字母 特征:特征词 方法1:CountVectorizer 统计每个样本特征词出现的个数 stop_words停用的 停用词表 关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少 方法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 - 逆向文档频率 特征预处理 2.4.1 什么是特征预处理 为什么我们要进行归一化/标准化? 无量纲化 2.4.2 归一化 异常值:最大值、最小值 2.4.3 标准化 (x - mean) / std 标准差:集中程度 应用场景: 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。 特征降维 2.5.1 降维 - 降低维度 ndarray 维数:嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维 二维数组 此处的降维: 降低特征的个数 效果: 特征与特征之间不相关 2.5.1 降维 特征选择 Filter过滤式 方差选择法:低方差特征过滤 相关系数 - 特征与特征之间的相关程度 取值范围:–1≤ r ≤+1 皮尔逊相关系数 0.9942 特征与特征之间相关性很高: 1)选取其中一个 2)加权求和 3)主成分分析 Embeded嵌入式 决策树 第二天 正则化 第三天 深度学习 第五天 主成分分析 2.6.1 什么是主成分分析(PCA) sklearn.decomposition.PCA(n_components=None) n_components 小数 表示保留百分之多少的信息 整数 减少到多少特征 2.6.2 案例:探究用户对物品类别的喜好细分 用户 物品类别 user_id aisle 1)需要将user_id和aisle放在同一个表中 - 合并 2)找到user_id和aisle - 交叉表和透视表 3)特征冗余过多 -> PCA降维 """
# 导入包
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer from sklearn.preprocessing import MinMaxScaler, StandardScaler from sklearn.feature_selection import VarianceThreshold from sklearn.decomposition import PCA from scipy.stats import pearsonr import jieba import pandas as pd
def datasets_demo(): """ sklearn数据集使用 :return: """ # 获取数据集 iris = load_iris() print("鸢尾花数据集:\n", iris) print("查看数据集描述:\n", iris["DESCR"]) print("查看特征值的名字:\n", iris.feature_names) print("查看特征值:\n", iris.data, iris.data.shape) # 数据集划分 x_train, x_test, 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
def dict_demo(): """ 字典特征抽取 :return: """ data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}] # 1、实例化一个转换器类 transfer = DictVectorizer(sparse=True) # 2、调用fit_transform() data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray(), type(data_new)) print("特征名字:\n", transfer.get_feature_names()) return None
def count_demo(): """ 文本特征抽取:CountVecotrizer :return: """ data = ["life is short,i like like python", "life is too long,i dislike python"] # 1、实例化一个转换器类 transfer = CountVectorizer(stop_words=["is", "too"]) # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
def count_chinese_demo(): """ 中文文本特征抽取:CountVecotrizer :return: """ data = ["我 爱 北京 天安门", "天安门 上 太阳 升"] # 1、实例化一个转换器类 transfer = CountVectorizer() # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
def count_chinese_demo2(): """ 中文文本特征抽取,自动分词 :return: """ # 将中文文本进行分词 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_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
def cut_word(text): """ 进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门" :param text: :return: """ return " ".join(list(jieba.cut(text)))
def tfidf_demo(): """ 用TF-IDF的方法进行文本特征抽取 :return: """ # 将中文文本进行分词 data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。", "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"] data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) # 1、实例化一个转换器类 transfer = TfidfVectorizer(stop_words=["一种", "所以"]) # 2、调用fit_transform data_final = transfer.fit_transform(data_new) print("data_new:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None
def minmax_demo(): """ 归一化 :return: """ # 1、获取数据 data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transfer = MinMaxScaler(feature_range=[2, 3]) # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None
def stand_demo(): """ 标准化 :return: """ # 1、获取数据 data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transfer = StandardScaler() # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None
def variance_demo(): """ 过滤低方差特征 :return: """ # 1、获取数据 data = pd.read_csv("factor_returns.csv") data = data.iloc[:, 1:-2] print("data:\n", data) # 2、实例化一个转换器类 transfer = VarianceThreshold(threshold=10) # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new, data_new.shape) # 计算某两个变量之间的相关系数 r1 = pearsonr(data["pe_ratio"], data["pb_ratio"]) print("相关系数:\n", r1) r2 = pearsonr(data['revenue'], data['total_expense']) print("revenue与total_expense之间的相关性:\n", r2) return None
def pca_demo(): """ PCA降维 :return: """ data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]] # 1、实例化一个转换器类 transfer = PCA(n_components=0.95) # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None
#%% # 1、获取数据 # 2、合并表 # 3、找到user_id和aisle之间的关系 # 4、PCA降维 #%% import pandas as pd #%% # 1、获取数据 order_products = pd.read_csv("./instacart/order_products__prior.csv") products = pd.read_csv("./instacart/products.csv") orders = pd.read_csv("./instacart/orders.csv") aisles = pd.read_csv("./instacart/aisles.csv") #%% # 2、合并表 # 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 # 合并aisles和products aisle和product_id tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"]) #%% tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"]) #%% tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"]) #%% tab3.head() #%% # 3、找到user_id和aisle之间的关系 table = pd.crosstab(tab3["user_id"], tab3["aisle"]) #%% data = table[:10000] #%% # 4、PCA降维 from sklearn.decomposition import PCA #%% # 1)实例化一个转换器类 transfer = PCA(n_components=0.95) # 2)调用fit_transform data_new = transfer.fit_transform(data) #%% data_new.shape #%%
作者:华王
博客:https://www.cnblogs.com/huahuawang/