Python 笔记 MachineLearning Stage 1

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

# ----------------------------------------数据集----------------------------------------
# sklearn.datasets : 加载获取流行数据集
# sklearn.datasets.load_*() : 获取小规模数据集, 数据包含在datasets里, '*'为数据集名称
# sklearn.datasets.fetch_*(data_home=None, subset='train' / 'Season1' / 'all') : 获取大规模数据, 需要从网上下载, data_home表示数据集下载的目录

# 鸢尾花
iris = load_iris()
print(iris)
print(type(iris))  # type为datasets.base.Bunch(字典格式)
# 键值对 :
# - data 特征数据数组, 是[n_samples*n_features]二维numpy.ndarray数组
# - target 标签数组, 是n_samples的一维数组
# - DESCR 数据描述
# - feature_names 特征数据, 手写数字和回归数据集没有
# - target_name 标签名

print(iris["DESCR"])

# 由于对数据训练完之后需要测试数据, 所以需要对数据集进行划分, 以保留部分数据
# 训练集 : 70% ~ 80%  测试集 : 20% ~ 30%

# ----- 数据集划分api -----
# sklearn.model_selection.train_test_split(arrays, *options)
# - x数据集的特征值
# - y数据集的标签值
# - test_size 测试集的大小, 一般为float 默认0.25
# - random_state 随机数种子, 不同的种子会生成不同的采样结果
# - return 返回顺序 : x_train 训练集特征值, x_test 测试集特征值, y_train 训练集目标值, y_test 测试集目标值
from sklearn.model_selection import train_test_split

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)

# ----------------------------------------特征工程----------------------------------------
# Feature Engineering : 数据和特征决定了机械学习的上限, 而模型和算法只是逼近了这个上限

# 特征抽取
# 机械学习方法 - 统计方法 - 数学公式 : 文本类型 -> 数值 ...


# ----- 字典特征提取(特征离散化) -----
# 类别 -> one-hot 编码
# sklearn.feature_extraction.DictVectorizer(sparse=Ture, ...)
# DictVectorizer.fit_transform(X) X : 字典或包含字典的迭代器, 返回的是sparse(稀疏)矩阵
# DictVectorizer.inverse_transform(X) X : array数组或者sparse矩阵, 返回转换之前的数据格式
# DictVectorizer.get_feature_names() : 返回类别名称
from sklearn.feature_extraction import DictVectorizer

data_1 = [{"city": "北京", "temperature": 100},
          {"city": "上海", "temperature": 60},
          {"city": "深圳", "temperature": 30}]

# 1.实例化一个转换器类
d_transfer = DictVectorizer(sparse=False)

# 2.调用fit_transform()
data_new_1 = d_transfer.fit_transform(data_1)

# print("   上海  北京  深圳")
print(data_new_1)

# 应用场景 : pclass, sex 数据集中类别特征比较多;公司, 同事合作

# ----- 文本特征提取 -----
# 单词作为特征
# -方法一 : CountVectorizer
# sklearn.feature_extraction.text.CountVectorizer(stop_words=["mamba", "out" ...] ...)  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, TfidfVectorizer

data_2_En = ["life is short, i like python very very much", "life is long, i dislike python"]
data_2_Cn = ["大烟杆 嘴里 塞, 我 只抽 第五代", "比养的 快尝尝, 我 现在 肺痒痒"]  # 中文需要空格隔开才能分为词而非句子

# 1.实例化一个转换器类
t_transfer = CountVectorizer()

# 2.调用fit_transform
data_new_2_En = t_transfer.fit_transform(data_2_En)

print(t_transfer.get_feature_names_out())  # 获取特征名字
print(data_new_2_En.toarray())  # 用toarray()方法以输出二位矩阵
data_new_2_Cn = t_transfer.fit_transform(data_2_Cn)
print(t_transfer.get_feature_names_out())
print(data_new_2_Cn.toarray())

# 中文文本特征提取,  借助jieba自动分词
import jieba

data_3 = ["我的锐刻就像一根根糖, 口味丰富到难以想象",
          "只要你往我鼻嘴里放, 我谈笑间吸干太平洋",
          "核污水不要再乱排放, 鬼子想喝就解我裤裆",
          "大家要是买不到锐刻, 往我的嘴里吸,都一样"]

fyy = []
for sen in data_3:
    fyy.append(" ".join(jieba.cut(sen)))  # 返回的是词语生成器

print(fyy)
print("--------------------")
# # 1.实例化一个转换器类
t_transfer = CountVectorizer()

# 2.调用fit_transform
data_new_3 = t_transfer.fit_transform(fyy)

print(t_transfer.get_feature_names_out())  # 获取特征名字
print(data_new_3.toarray())  # 用toarray()方法以输出二位矩阵

# -方法二 : TfidfVectorizer
# Tf-idf文本特征提取 : 关键词对于一个文件集, 或一个语料库的其中一份文件的重要程度
# 词频 term frequency - tf, 逆向文档频率 inverse document frequency - idf : 总文件数目除以包含该词语文件的数目, 将结果取10为底的对数
# 重要程度 : tfidf(i,j) = tf(i,j) * idf(i)

data_4 = ["在这么冷的天, 想抽根电子烟", "可锐克没有电, 可是雪豹已失联",
          "摘不下我虚伪的假面, 几句胡言被奉为圣谏", "尝一口你血汗的香甜, 可是钱飘进双眼"]

distance = []
for sen in data_4:
    distance.append(" ".join(jieba.cut(sen)))

# 1.实例化一个转换器类
Tf_transfer = TfidfVectorizer()

# 2.调用fit_transform
data_new_4 = Tf_transfer.fit_transform(distance)
print(data_new_4.toarray())

# ----- 图像特征提取 ----- (深度学习)

# ----- 特征预处理 -----
# 通过一些转换函数, 将特征数据转换成更加适合算法模型的特征数据过程 : 无量纲化, 不同规格的数据转换到同一规格
from sklearn import preprocessing
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# -归一化
# 鲁棒性(健壮性)较差, 适合传统精确小数据场景
# x' = (x - min) / (max - min) , x'' = x' * (mx - mi) + mi
# max/min 为每一列的最大/小值, x''为最终结果. mx和mi为指定区间值, 默认为1和0

# 1.获取数据
lst = np.array([[40920, 8.326976, 0.953952, 3], [14488, 7.153469, 1.673904, 2], [26052, 1.441871, 0.805124, 1],
                [75136, 13.147394, 0.428964, 1], [38344, 1.669788, 0.134296, 1], [72993, 10.141740, 1.032955, 1],
                [35948, 6.830792, 1.213192, 3], [42666, 13.276369, 0.543880, 3], [67497, 8.631577, 0.749278, 1],
                [35483, 12.273169, 1.508053, 3], [50242, 3.723498, 0.831917, 1], [63275, 8.385879, 1.669485, 1],
                [5569, 4.875435, 0.728658, 2], [51052, 4.680098, 0.625224, 1], [77372, 15.299570, 0.331351, 1],
                [43673, 1.889461, 0.191283, 1], [61364, 7.516754, 1.269164, 1], [69673, 14.239195, 0.261333, 1],
                [15669, 0.000000, 1.250185, 2], [28488, 10.528555, 1.304844, 3], [6487, 3.540265, 0.822483, 2],
                [37708, 2.991551, 0.833920, 1], [22620, 5.297865, 0.638306, 2], [28782, 6.593803, 0.187108, 3],
                [19739, 2.816760, 1.686209, 2], [36788, 12.458258, 0.649617, 3], [5741, 0.000000, 1.656418, 2],
                [28567, 9.968648, 0.731232, 3], [6808, 1.364838, 0.640103, 2]]).reshape(29, 4)
data_5 = pd.DataFrame(lst,
                      index=list(f"{i}" for i in range(1, 30)),
                      columns=list(["milage", "Liters", "Consumtime", "target"])
                      )
# print(data_5)
data_5 = data_5.iloc[:, :3]

# 2.实例化一个转换器类
pre_transfer = MinMaxScaler()  # feature_range=[]参数为指定区间, 默认为[0,1]

# 3.调用fit_transform
data_new_5 = pre_transfer.fit_transform(data_5)
print(data_new_5) # 转换完成

# -标准化
# x' = (x - mean)/sigma
# mean 为平均值, sigma 为标准差

# 1.获取数据
# 2.实例化一个转换器类
pre_transfer = StandardScaler()

# 3.调用fit_transform
data_new_5 = pre_transfer.fit_transform(data_5)
print(data_new_5)  # 转换完成

# ----- 特征降维 -----
# 对象 : 二维数组 -> 降低特征个数, 得到一组"不相关"主变量的过程, 以达到特征与特征之间不相关

# - 1 : 特征选择
# 数据中包含冗余或相关变量(特征, 属性, 指标等), 旨在从原有特征中找出主要特征
# 方法 : 1.Filter(过滤式):探究特征本身特点, 特征与特征和目标值之间关联 -方差选择法, 相关系数法
# 2.Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)-决策树, 正则化, 深度学习:卷积等
from sklearn.feature_selection import VarianceThreshold

# API : sklearn.feature_selection.VarianceThreshold(threshold = 0.0) threshold : 临界值
# 删除所有低方差特征
# Variance.fit_transform(X) X :numpy array格式的数据, 默认值是保留所有非零方差特征

# # 1.获取数据
data_6 = pd.read_csv("D:/dev/resources/MLR/机器学xiday1资料/02-代码/factor_returns.csv")
data_6 = data_6.iloc[:, 1:10]

# # 2.实例化一个转换器类
fs_transfer = VarianceThreshold()

# # 3.调用fit_transform
data_new_6 = fs_transfer.fit_transform(data_6)
print(data_new_6)

# -相关系数 r 0.4 | 0.7 | 1
from scipy.stats import pearsonr

# 计算某两个变量之间的相关系数
r = pearsonr(data_6["pe_ratio"], data_6["pb_ratio"])
print(r)

# 特征与特征之间相关性很高 : 1.选其中一个 2.加权求和 3.主成分分析 ->

# -主成分分析(PCA)
# 定义 : 高维数据转化为低维数据的过程, 在此过程可能会舍去原有数据, 创造新的变量
# 作用 : 数据维数压缩, 尽可能降低原数据的维度, 损失少量信息
# 应用 : 回归分析或者聚类分析中
from sklearn.decomposition import PCA

# API : sklearn.decomposition.PCA(n_components=None) n_components : 小数 表示保留百分之多少的信息, 整数 减少到多少特征
# PCA.fit_transform(X) X : numppy array 格式的数据, 返回指定维度的数组
data_7 = [[2, 8, 4, 5],
          [6, 3, 0, 8],
          [5, 4, 9, 1]]

# # 1.实例化一个转换器类
pca_transfer = PCA(n_components=2)  # 表示转换为两个特征

# 2.调用fit_transform
data_new_7 = pca_transfer.fit_transform(data_7)
print(data_new_7)

# ---------------------------------------- 实战 ----------------------------------------
# 探究Instacart消费者将购买哪些产品

# 1.获取数据
order_products = pd.read_csv("D:/dev/resources/MLR/机器学xiday1资料/02-代码/instacart/order_products__prior.csv")
products = pd.read_csv("D:/dev/resources/MLR/机器学xiday1资料/02-代码/instacart/products.csv")
orders = pd.read_csv("D:/dev/resources/MLR/机器学xiday1资料/02-代码/instacart/orders.csv")
aisle = pd.read_csv("D:/dev/resources/MLR/机器学xiday1资料/02-代码/instacart/aisles.csv")

# 2.合并表
tab1 = pd.merge(aisle, 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"])

# 3.找到user_id和aisle之间的关系
data = pd.crosstab(tab3["user_id"], tab3["aisle"])[:10000]

# 4.PCA降维
pca_transfer = PCA(n_components=0.95)
data_new = pca_transfer.fit_transform(data)

print(data_new)
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值