# -*- 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)
Python 笔记 MachineLearning Stage 1
最新推荐文章于 2024-08-24 11:00:49 发布