学习框架 |
数据
中自动分析获得模型
, 并利用模型对未知数据进行预测
监督学习 (预测) : 基于数据和结果进行预测,一组输入数据对应一个正确的输出结果。输入数据是由输入特征值与目标值组成 , 函数的输出可以是一个连续的值 (称为回归) , 或输出有限个离散值 (称为分类)
1 . 目标值是类别 – 分类问题
- 算法 : k - 近邻算法 , 贝叶斯算法 , 决策树与随机森林 , 逻辑回归
2 . 目标值是连续型的数据 – 回归问题
- 算法 : 线性回归 , 岭回归
无监督学习 : 输入的数据由特征值组成,从数据中挖掘关联性。不存在正确答案,例如数据聚类,相关新闻自动推送
1 . 无目标值 – 无监督学习
- 聚类 : k-means
- 获取数据
数据预处理
特征工程 (将数据处理成更能被学习算法使用的数据)
机器学习算法训练 – 模型
模型评估
应用
可用数据集 (学习阶段) : Sklearn , Kaggle , UCI
sklearn数据集 (sklearn.datasets)
- load_* 获取小规模数据集
小数据集 : sklearn.datasets.load_iris()- fetch_* 获取大规模数据集
大数据集 : sklearn.datasets.fetch_20newgroups(data_home=None, subset=“train”)
第一个参数 : 是数据集下载的目录 , 默认是~/scikit_learn_data
第二个参数 : “train” , “test” , “all” , 可选 , 按着要下载的数据集 , 训练集的"训练" , 测试集的"测试" , 两者的"全部"- 数据集的返回值 : datasets.base.Bunch(字典格式)
dist[“key”] = values
bunch.key = values
数据集的划分
机器学习一般的数据集会划分两部分
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["DESCR"])
print("鸢尾花的特征值名称", iris.feature_names)
print("鸢尾花的特征值", iris.data)
print("鸢尾花的目标值名称", iris.target_names)
print("鸢尾花的目标值", iris.target)
print("", 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("训练集的特征值", x_train, x_train.shape)
print("测试集的特征值", x_test, x_test.shape)
print("训练集的目标值", y_train, y_train.shape)
print("测试集的目标值", y_test, y_test.shape)
return None
if __name__ == "__main__":
# 代码1 : sklearn数据集的使用
datasets_demo()
字典特征提取 --> 属于类别的特征转化成one-hot编码
- matrix 矩阵 : 二维数组
vector 向量 : 一维数组- 父类 :
transfer转换器类 , 返回sparse(稀疏)矩阵 , 将非零值按照位置(某行某列)表示 , 节省内存 , 提高加载效率- 应用场景 :
第一 : 数据集中类别比较多时 , 先将数据集特征转化成字典类型 , 再进行DictVectorizer转换
第二 : 本身拿到的数据类型是字典类型
from sklearn.feature_extraction import DictVectorizer
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, type(data_new))
print("data_new :\n", data_new.toarray())
print("特征名字 : \n", transfer.feature_names_)
print("特征名字 : \n", transfer.get_feature_names())
return None
if __name__ == "__main__":
# 代码2 : 字典特征抽取
dict_demo()
文本特征抽取
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def count_demo():
"""
文本特征抽取
:return:
"""
data = ["life is short, i like like python", "life is too long, i dislike python"]
# 1. 实例化一个转换器类
transfer = CountVectorizer()
# 2. 调用fit_transform()方法
data_new = transfer.fit_transform(data)
print("data_new", data_new, data_new.toarray())
print("特征名字: \n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
:return:
"""
data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
# 1. 实例化一个转换器类
transfer = CountVectorizer()
# 2. 调用fit_transform()方法
data_new = transfer.fit_transform(data)
print("data_new", data_new, data_new.toarray())
print("特征名字: \n", transfer.get_feature_names())
return None
def cut_word(text):
"""
进行中文分词 : 我爱北京天安门 --> 我 爱 北京 天安门
:param text:
:return:
"""
a = " ".join(list(jieba.cut(text)))
print(a , type(a))
return text
def count_chinese_jieba_demo():
"""
中文文本特征抽取 , 自动分词
:return:
"""
# 1. 将中文文本进行分词
data = ["一种还是一种, 今天很残酷, 明天更残酷, 后天很美好, 但绝对大部分是死在明天晚上, 所以每个人不要放弃今天.",
"我们看到的从很远星系来的光是在几百万年前发出来的, 这样当我们看到宇宙时, 我们是在看它的过去.",
"如果只是用一种方式了解某种事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其与我们所熟悉的事物相联系"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 2. 实例化一个转换器类
transfer = CountVectorizer()
# 3. 调用fit_transform()方法
data_jieba_new = transfer.fit_transform(data_new)
print("data_jieba_new", data_jieba_new, data_jieba_new.toarray())
print("特征名字: \n", transfer.get_feature_names())
return None
def tfidf_demo():
"""
TF-IDF方法进行文本特征抽取
:return:
"""
# 1. 将中文文本进行分词
data = ["一种还是一种, 今天很残酷, 明天更残酷, 后天很美好, 但绝对大部分是死在明天晚上, 所以每个人不要放弃今天.",
"我们看到的从很远星系来的光是在几百万年前发出来的, 这样当我们看到宇宙时, 我们是在看它的过去.",
"如果只是用一种方式了解某种事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其与我们所熟悉的事物相联系"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 2. 实例化一个转换器类
transfer = TfidfVectorizer()
# 3. 调用fit_transform()方法
data_jieba_new = transfer.fit_transform(data_new)
print("data_jieba_new", data_jieba_new, data_jieba_new.toarray())
print("特征名字: \n", transfer.get_feature_names())
return None
if __name__ == "__main__":
# 代码3 : 文本的特征抽取
count_demo()
# 代码4 : 中文文本特征抽取
count_chinese_demo()
# 代码5 : 中文文本特征抽取 , 自动分词
count_chinese_jieba_demo()
# 代码6 : 中文文本特征抽取 , jieba分词
count_chinese_jieba_demo()
# 代码7 :TF-IDF方法进行文本特征抽取
tfidf_demo()
概念 : 通过一些转换函数将特征数据转换成更适合算法模型的特征数据的过程
包含的内容 : 数值型数据的无量纲化 (归一化 , 标准化)
API : sklearn.preprocessing
归一化过程及其API
异常值 : 在最大值 , 最小值中 , 若最大值 , 最小值是异常值 , 则归一化结果不准确
适用场景 : 因为鲁棒性 (健壮性 稳定性) 较差 , 因此只适合传统精确小数据场景
归一化过程
归一化API
标准化及其API
适用场景 : 在已有样本足够多的情况下比较稳定 , 适合现代嘈杂的大数据场景
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
def mixmax_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
if __name__ == "__main__":
# 代码8 : 归一化
mixmax_demo()
# 代码9 : 标准化
stand_demo()
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import pandas as pd
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 1. 获取数据
data = pd.read_csv(".../factor_returns.csv")
data = data.iloc[:, 1:-2]
# print(data)
# 2. 实例化一个转换器类
transfer = VarianceThreshold(threshold=5)
# 3. 调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new : \n", data_new, data_new.shape)
# 计算某两个变量之间的相关系数
r = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数 : ", r)
return None
if __name__ == "__main__":
# 代码10 :过滤低方差特征
variance_demo()
from sklearn.decomposition import PCA
def pca_demo():
"""
pca降维
:return:
"""
data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
# 1. 实例化一个转换器类
transfer = PCA(n_components=2)
# transfer = PCA(n_components=0.95)
# 2. 调用fit_transform
data_new = transfer.fit_transform(data)
print("pca降维 : \n", data_new)
return None
if __name__ == "__main__":
# 代码11 :主成分分析pca降维
pca_demo()
- 分析对象 :
用户 物品类别
user_id aisle
第一 : 需要将user_id和aisle放入一个表中
第二 : 找到user_id和aisle的关系 — 交叉表和透视表
第三 : 特征冗余过多 , PCA降维
# 1. 获取数据
# 2. 合并表
# 3. 找到user_id和aisle之间的关系
# 4. PCA降维
import pandas as pd
# 1. 获取数据
order_products = pd.read_csv(".../order_products_prior.csv")
products = pd.read_csv(".../products.csv")
orders = pd.read_csv(".../orders.csv")
aisles = pd.read_csv(".../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
# order.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