机器学习_第一天(特征工程:特征抽取+特征预处理+特征降维)

【机器学习】特征工程——数据降维 特征工程 定义:将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。 内容:主要有三部分:   1、特征抽取   2、特征预处理   3、数据的降维 数据降维 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。f可能是显式的或隐式的、线性 阅读详情


​

机器学习

算法是核心,数据和计算是基础清楚算法原理与适用场景即可,不用深究数学问题。大部分复杂模型的算法设计都是算法工程师在做,机器学习重点是:

  • 分析大量的数据
  • 分析具体的业务
  • 应用常见的算法
  • 特征工程、调参数、优化

机器学习的数据多为文件形式(csv),不使用mysql(mysql读取速度慢;格式不符合机器学习要求)
在这里插入图片描述​

1、可用数据集

  1. Kaggle
    特点:
    大数据竞赛平台
    80万科学家
    真实数据
    数据量巨大
  2. UCI数据集
    特点:
    覆盖科学、生活、经济等领域
    收录了360个数据集
    数据量几十万
  3. scikit-learn库
    特点:
    数据量较小
    方便学习

2、特征工程

特征工程直接影响模型的预测结果。特征工程是将原始数据转换为更好地代表预测模型潜在问题特征的过程,从而提高了对未知数据的模型准确性。

  • 数据的结构
    结构:特征值+目标值
    在这里插入图片描述​
    注:有些数据集可以没有目标值
  • 对特征的处理
    机器学习不用对重复数据进行去重,重复数据重复学习不影响模型
    pandas:读取数据、简易处理格式
    sklearn:对特征的处理提供了强大的接口

2.1 特征抽取

针对字符串类型数据进行数值的转换(特征化),特征值化是为了计算机更好的去理解数据
sklearn特征抽取的API:sklearn.feature_extraction

2.1.1 字典特征抽取

对字典数据进行特征值化:sklearn.feature_extraction.DictVectorizer

DictVectorizer(sparse=False)

  • DictVectorizer.fit_transform(X)
    X:字典或者包含字典的迭代器
    返回值:默认返回sparse矩阵,sparse=False返回ndarry数组
  • DictVectorizer.inverse_transform(X)
    X:array数组或者sparse矩阵
    返回值:转换之前数据格式
  • DictVectorizer.get_feature_names()
    返回类别名称
  • DictVectorizer.transform(X)
    按照原先的标准转换
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("data_new sparse矩阵:\n", data_new, type(data_new))
    print("特征名字:\n", transfer.get_feature_names())

    return None

执行结果:
​

a. one-hot编码:

在这里插入图片描述​
将每一个类别生成一个布尔列,同一个样本只有一个布尔列取值为1,避免单纯的数字分组产生优先级问题
在这里插入图片描述​

2.1.2 文本特征抽取

a. 词频矩阵(Count)

对文本数据进行特征值化:sklearn.feature_extraction.text.CountVectorizer
作用:通过词频分析文本类型、情感方向(单个英文字母/中文词无分类依据,不计算词频)

CountVectorizer()

  • CountVectorizer.fit_transform(X)
    X:文本或者包含文本字符串的可迭代对象
    返回值:返回sparse矩阵,通过.toarray()转换成数组类型
  • CountVectorizer.inverse_transform(X)
    X:array数组或者sparse矩阵
    返回值:转换之前数据格式
  • CountVectorizer.get_feature_names()
    返回值:单词列表
    e.g 英文文本特征抽取
  • 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("data_new sparse矩阵:\n", data_new)
        print("特征名字:\n", transfer.get_feature_names())
    
        return None

    执行结果:英文文本特征抽取​text.CountVectorizer以空格视为词语的分隔,对于中文需要先进行分词处理才能详细的进行特征值化

jieba.cut(’ '):对中文句子进行分词,返回的是一个迭代器,要先转换成列表,再以" ".join()相连成字符串,才能用于文本特征抽取。

e.g 中文文本特征抽取

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("data_new sparse矩阵:\n", data_new)
    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

执行结果:

data_new:
 [[0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0]
 [0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1]
 [1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0 0]]
特征名字:
 ['不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

b. 权重矩阵(TF-IDF)—分类机器学习算法的的重要依据

  1. 词频矩阵(tf:term frequency),统计词语出现次数
  2. 逆文档频率(idf:iverse document frequency),log(总文档数量/改词出现的文档数量),计算得到的输⼊值越⼩,log返回结果越⼩。
  3. 重要性程度 = tf * idf,log排除各文档公共词频高度重合的无意义词汇,剩下的词再通过词频判断词语的重要性,从而推断文章主题。

对文本数据进行特征值化:sklearn.feature_extraction.text.TfidfVectorizer
作用:评估词对于一个文件集或一个语料库中的其中一份文件的重要程度。若某个词在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词重要性程度高,具有很好的类别区分能力。

TfidfVectorizer(stop_words=None)

  • TfidfVectorizer.fit_transform(X)
    X:文本或者包含文本字符串的可迭代对象
    返回值:返回sparse矩阵
  • TfidfVectorizer.inverse_transform(X)
    X:array数组或者sparse矩阵
    返回值:转换之前数据格式
  • TfidfVectorizer.get_feature_names()
    返回值:单词列表
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

执行结果:

data_new:
 [[0.         0.21821789 0.         0.         0.         0.43643578
  0.         0.         0.         0.         0.         0.21821789
  0.         0.21821789 0.         0.         0.         0.
  0.21821789 0.         0.43643578 0.         0.21821789 0.
  0.43643578 0.21821789 0.         0.         0.         0.21821789
  0.21821789 0.         0.         0.21821789 0.        ]
 [0.         0.         0.2410822  0.         0.         0.
  0.2410822  0.2410822  0.2410822  0.         0.         0.
  0.         0.         0.         0.         0.2410822  0.55004769
  0.         0.         0.         0.2410822  0.         0.
  0.         0.         0.48216441 0.         0.         0.
  0.         0.         0.2410822  0.         0.2410822 ]
 [0.15895379 0.         0.         0.63581516 0.47686137 0.
  0.         0.         0.         0.15895379 0.15895379 0.
  0.15895379 0.         0.15895379 0.15895379 0.         0.12088845
  0.         0.15895379 0.         0.         0.         0.15895379
  0.         0.         0.         0.31790758 0.15895379 0.
  0.         0.15895379 0.         0.         0.        ]]
特征名字:
 ['不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

2.2 特征的预处理:对数据进行处理

特征的预处理对数据进行处理,通过特定的统计方法(数学方法)将数据转换成算法要求的数据

  • 数据预处理方法:
    数值型数据–标准缩放:
     1. 归一化
     2. 标准化
     3. 缺失值
    类别型数据:one-hot编码
    时间类型:时间的切分

sklearn特征预处理的API:sklearn.preprocessing

2.2.1 归一化

通过对原始数据进行变换,把数据映射到(默认为[0,1])之间。当多个特征同等重要时,要使用归一化,避免因数量级上的不同导致某⼀个特征对最终结果造成更⼤影响。
在这里插入图片描述​
注:作用于每一列特征,max为一列的最大值,min为一列的最小值。X’’为最终结果,mx、mi分别为指定区间,值默认mx为1、mi为0
缺点:最大值与最小值非常容易受异常点的影响,使得公式出现偏差。所以归一化方法鲁棒性(稳定性)较差,只适合传统精确小数据场景(此场景很少)。
对数值数据进行归一化:sklearn.preprocessing.MinMaxScaler

MinMaxScalar(feature_range=(0,1))

  • MinMaxScalar.fit_transform(X)
    X:numpy array格式的二维数据[n_samples,n_features]
    返回值:转换后的形状相同的array
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

 执行结果:

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.332446

[1000 rows x 3 columns]
data_new:
 [[2.44832535 2.39805139 2.56233353]
 [2.15873259 2.34195467 2.98724416]
 [2.28542943 2.06892523 2.47449629]
 ...
 [2.29115949 2.50910294 2.51079493]
 [2.52711097 2.43665451 2.4290048 ]
 [2.47940793 2.3768091  2.78571804]]

2.2.2 标准化(使用场景更常见)

通过对原始数据进行变换把数据变换到均值0附近,标准差为1范围内。对于标准化来说由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而对方差和标准差影响也小。
特点:适合现代嘈杂大数据场景,在已有样本足够多的情况下异常点影响小,比较稳定。
在这里插入图片描述​
在这里插入图片描述​
注:作用于每一列特征,mean为平均值,σ为标准差(考量数据的稳定性,数据集中标准差小,数据离散标准差大)
对数值数据进行标准差:sklearn.preprocessing.StandardScaler

StandardScaler()

  • StandardScaler.fit_transform(X)
    X:numpy array格式的二维数据[n_samples,n_features]
    返回值:转换后的形状相同的array
  • StandardScaler.mean_
    原始数据中每列特征的平均值
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

执行结果: 

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.332446

[1000 rows x 3 columns]
data_new:
 [[ 0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ...
 [-0.32171752  0.96431572  0.06952649]
 [ 0.65959911  0.60699509 -0.20931587]
 [ 0.46120328  0.31183342  1.00680598]]

2.2.3 缺失值(多用pandas处理)

缺失值处理方法

  • 删除:如果每列或每行数据缺失值达到一定的比例,建议放弃整行或整列
  • 填补:可以对每行或每列的缺失值填充平均值或中位数

a. sklearn处理缺失值

进行缺失值的填补
sklearn缺失值API: sklearn.impute.SimpleImputer

SimpleImputer(missing_values=np.nan, strategy=‘mean’)

  • SimpleImputer.fit_transform(X)
    X:numpy array格式数据
    返回值:转换后的形状相同的array
from sklearn.impute import SimpleImputer
import numpy as np

def im():
    '''
    缺失值处理
    :return:
    '''
    im = SimpleImputer(missing_values=np.nan, strategy='mean')
    data = im.fit_transform([[1, 2],
                   [np.nan, 3],
                   [7, 6]]
                  )
    print(data)
    return None

if __name__ == '__main__':
    im()

执行结果: 

在这里插入图片描述​

 

b. pandas处理缺失值

使用指定的统计值来代替缺失值np.nan,注意nan的数据类型为float类型。如果缺失值不是规范np.nan(float形式),可以通过replace(“?”, np.nan)将其他符号标记的缺失值,统一替换成np.nan。

  • 判断是否为nan
    1.pd.isnull(df)–为nan的元素返回Ture
    2.pd.notnull(df)–为nan的元素返回False
  • 处理nan
    1.删除数据
     dropna (axis=0, how=‘any’, inplace=False)
     axis=0删除行,axis=1删除列
     how=‘any’(默认)只要该行/列含有nan就删除,how='all’整行/整列都为nan时删除
     inplace=True在原对象上进行更改,默认inplace=False
    2.填充数据
     df.fillna(df.mean()/df.median()/0)-- 填均值/中位数/零
     ps:对无意义的0可以先处理为nan再处理缺失值(df[df==0]=np.nan)

2.3 数据降维

2.3.1 特征选择

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,对特征数量进行降维。

  • 特征选择原因:
    避免冗余:部分特征的相关度高,容易消耗计算性能
    消除噪声:部分特征对预测结果有负影响
  • 特征选择的三大方法:
    Filter(过滤式):VarianceThreshold
    Embedded(嵌入式):正则化、决策树
    Wrapper(包裹式):基本不使用

sklearn特征选择API:sklearn.feature_selection

a. 过滤式

通过方差的值,删除所有低方差特征。如当一列数值大都相同的情况下,即var≈0,则过滤此特征。
sklearn特征选择过滤式API:sklearn.feature_selection.VarianceThreshold

VarianceThreshold(threshold = 0.0)
训练集方差低于指定threshold的特征将被删除,threshold可取0~10之间的数,根据实际情况设定。默认值保留所有非零方差特征,即删除值相同的特征。

  • VarianceThreshold.fit_transform(X)
    X:numpy array格式的数据
from sklearn.feature_selection import VarianceThreshold

def var():
    '''
    过滤式特征选择--删除低方差的特征
    :return: None
    '''
    var = VarianceThreshold(threshold=0.0)  # threshold默认0.0
    data = var.fit_transform([[0, 2, 0, 3],
                              [0, 1, 4, 3],
                              [0, 1, 1, 3]]
                             )
    print(data)
    return None

if __name__ == '__main__':
    var()

执行结果:
在这里插入图片描述​

2.3.2 主成分分析

主成分分析又称为PCA,是一种简化数据集的技术,在特征数过百的情况下,考虑数据的简化。高维特征普遍存在特征与特征之间线性相关的情况,通过压缩数据维度,在损失少量信息情况下,尽可能降低原数据的维数(复杂度)。
作用:可以削减回归分析或者聚类分析中特征的数量
sklearn主成分分析降维API:sklearn. decomposition
sklearn主成分分析PCA语法API:sklearn. decomposition.PCA

PCA(n_components=None):

  • n_components取值:
    1.小数:指定信息保留率,保留率一般在90%~95%
    2.整数:指定保留特征数量,一般不用
  • PCA.fit_transform(X)
    X:numpy array格式的数据[n_samples,n_features]
    返回值:转换后指定维度的array
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

 执行结果:

​

a. 案例:研究用户对物品类别的喜好细分降维

  • 数据:
    products.csv:商品信息
    order_products__prior.csv:订单与商品信息
    orders.csv:用户的订单信息
    aisles.csv:商品所属具体物品类别
  • 第一步:合并各张表到一张表(pandas–pd.merge())
    products:product_id, aisle_id
    prior:order_id,product_id
    orders:order_id,user_id
    aisles:aisle_id
import pandas as pd
from sklearn.decomposition import PCA

# 读取四张表的数据 
aisles=pd.read_csv(r"F:\working\pycharm_project\machine_learn\data\aisles.csv")
prior=pd.read_csv(r"F:\working\pycharm_project\machine_learn\data\order_products__prior.csv")
orders=pd.read_csv(r"F:\working\pycharm_project\machine_learn\data\orders.csv")
products=pd.read_csv(r"F:\working\pycharm_project\machine_learn\data\products.csv")
# 将四张表合并至一张表
_mg=pd.merge(products, prior, on=('product_id','product_id'))
_mg=pd.merge(_mg, orders, on=('order_id','order_id'))
mg=pd.merge(_mg, aisles, on=('aisle_id','aisle_id'))

在这里插入图片描述​

  • 第二步:建立行为用户id,列为物品种类的交叉表
    pd.crosstab(表[行维度],表[列维度])
# 交叉表:特殊的分组工具
cross=pd.crosstab(mg['product_id'],mg['aisle'])

在这里插入图片描述​

  • 第三步:进行主成分分析,进行降维
# 进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)

在这里插入图片描述​

附:最全代码

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("data_new sparse矩阵:\n", data_new, 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("data_new sparse矩阵:\n", data_new)
    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("data_new sparse矩阵:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())

    return None


def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))


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 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

if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    # datasets_demo()
    # 代码2:字典特征抽取
    # dict_demo()
    # 代码3:文本特征抽取:CountVecotrizer
    # count_demo()
    # 代码4:中文文本特征抽取:CountVecotrizer
    # count_chinese_demo()
    # 代码5:中文文本特征抽取,自动分词
    # count_chinese_demo2()
    # 代码6:中文分词
    # print(cut_word("我爱北京天安门"))
    # 代码7:用TF-IDF的方法进行文本特征抽取
    # tfidf_demo()
    # 代码8:归一化
    # minmax_demo()
    # 代码9:标准化
    # stand_demo()
    # 代码10:低方差特征过滤
    # variance_demo()
    # 代码11:PCA降维
    pca_demo()

 

机器学习 | 特征工程(数据预处理、特征抽取) 所谓特征工程即模型搭建之前进行的数据预处理和特征提取。有时人们常常好高骛远,数据都没处理好就开始折腾各种算法,从第一开始就有问题,那岂不是还没开始就已经结束了。所以说啊,不积跬步无以至千里,生活中的每个细节,都可能创造人生的辉煌。 特征工程 什么是特征工程 特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。直接决定了模型预测的结果好坏。 简单的说,就是一个特征提取和数据预处理的过程。 而机器学习中想要做好特征处理,一定离不开一个工具,那就是skl 阅读详情

相关推荐

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 577

【机器学习】特征提取与传统图像处理算法

目录特征提取图像二值化阈值分割自适应阈值分割双峰法最大类间方差法(OTSU)形态学处理(morphology)膨胀腐蚀开运算闭运算特征描述子 特征提取 为了将数字图像有效地转换为结构化数据,需要用到图像特征提取的技术降低数据的维度。其主要思路有: 降采样:通过缩放等降采样技术降低待分析图像数据的分辨率。 分割感兴趣区域(Region of Interest,ROI):通过分割技术,提取图像中的感兴趣目标的区域,减少待处理的数据量。 特征描述子:将图像转为固定长度的特征向量。 图像二值化 将像素点的灰度值全部

sword_csdn的博客 2584

将赛灵思 SDK 工程移植到 Vitis 的分步指南

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。 您是赛灵思软件开发套件 (SDK) 用户吗? 您是否正在计划将自己的工程移植到 Vitis 软件平台? 那么本篇工程移植分步指南将能祝您一臂之力。 从 2019.2 版开始,赛灵思 SDK 开发环境已统一整合到全功能一体化的 Vitis™ 统一软件平台中。 尊敬的 SDK 用户,您只需轻点几下鼠标即可体验这一功能丰富的工具! 马上开始将工程从赛灵思 S

weixin_45825101的博客 1731

二值化_图像处理学习笔记(七)——二值化、阈值处理、灰度、分段线性(理论篇)...

语言:C++环境:vs2019本章主要学习:1、图像二值化;2、阈值处理;3、灰度变换处理;4、分段线性变换;上一章,讲了灰度变换有线性变换和非线性变换;这一章,我们还是将线性变换;一、二值化法如图对应表达式如下式:公式一经过二值化后(给个阈值),大于阈值取0或255,或者小于阈值取255或0,最终结果获取一副二值图像;二值化很重要,对一副图片进行二值化处理后,我们就可以进一步进行去噪处理和特征提...

weixin_34771903的博客 1555

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 454

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 81

一文搞懂图像二值化算法

一文搞懂图像二值化算法

qq_44597856的博客 838

基础矩阵、本质矩阵、单应矩阵

基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

Gloamirror的博客 1327

图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)

图像二值化应用场景二值图像定义阈值获取的方法手动阈值法自动阈值法灰度均值法基于直方图均值法OTSUTriangle自适应均值阈值分割方法总结参考文献 应用场景 二值图像处理与分析在机器视觉与机器人视觉中非常重要,涉及到非常多的图像处理相关的知识,常见的二值图像分析包括轮廓分析、对象测量、轮廓匹配与识别、形态学处理与分割、各种形状检测与拟合、投影与逻辑操作、轮廓特征提取与编码等。本文将着重介绍如何从...

weixin_43046653的博客 1万+

共享单车需求预测问题:建模篇

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295) 在上一篇里,我们使用可视化的方法分析了“共享单车”的数据集,理解了特征(变量)之间的关系。我们将在本篇建立几个模型预测单车的需求量,并比较它们的预测效果。 随机森林填充法 首先,导入必需的库、训练集和检验集。 import pylab import calendar import numpy as np impor...

wong2016的博客 1万+

Luma AI技术浅析(一)

是一款基于人工智能的3D内容生成平台,旨在通过深度学习技术实现高效、高质量的3D场景、物体和动画的生成。Luma AI 主要利用了等技术,以实现从图像、视频到3D模型的转换和生成。

m0_75253143的博客 1727

黑马程序员机器学习Day1学习笔记

1.数据集的介绍字典特征抽取文本特征提取1.根据词频2.根据词的重要性特征预处理1.归一化标准化特征降维Filter过滤式:低方差过滤法PCA降维 机器学习第一天 基础不牢,地动山摇。直接上手tf,连很多机器学习的基础包都不会使用。比如sklearn, pandas (使用sklearn 来做特征工程 , pandas 用于数据的清洗和数据的处理)这些数据处理库,因此回去回炉重造,学习机器学习先。 学习的视频是黑马程序员的机器学习视频。 视频和资料链接 提取码:1234 本篇文章内容: 开发流程

文鸿开源工作室 1445

反光柱定位算法实战03:VEnus代码解析和纯反光柱定位中的可改进方向

本文深入解析了开源框架VEnus的反光柱定位与建图实现流程,包括强度提取、聚类、数据关联、位姿优化等核心模块。同时指出其三大局限:匹配质量脆弱性、单一传感器依赖和地图扩展逻辑缺失,并提出改进方向:融合里程计/IMU数据、引入图优化后端、建立动态地图维护机制。该分析为基于反光柱的定位系统优化提供了实用参考,有助于提升工业场景下的定位鲁棒性和精确性。

Studying…… 520

机器学习中的特征工程

目录 一、特征工程——概述 二、特征工程——数据预处理 三、特征工程——特征选择 四、特征工程——降维 一、特征工程——概述 特征工程是数据分析中最耗时间和精力的一部分工作。数据和特征决定了机器学习的上限,而模型和算法则是逼近这个上限。因此,特征工程就变得尤为重要了。特征工程的主要工作就是对特征的处理,包括数据的采集,数据预处理,特征选择,甚至降维技术等跟特征有关的工作。 1、特征(...

分享实践与思考 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

机器学习(数据集的组成、特征工程、特征抽取、特征预处理、数据降维)

一.什么是机器学习及其目的 机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。 目的:让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。 二.数据集的构成 1.历史数据的格式 机器学习的数据:文件csv。 不存在Mysql:因为存在性能瓶颈(数据大的时候,读取速度受限),格式不太符合机器学习要求的数据格式。 Pandas(读取工具):处理计算速度非常快,nump...

weixin_44495254的博客 4529

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

3.特征工程-特征抽取、特征预处理、特征降维

2.train_test_split()调用划分数据集的函数,test_size=0.2意思是将150个数据中的20%划分为测试集,剩下的80%为训练集。3.与TfidfVectorizer()计算出的结果不同,CountVectorizer()统计的是特征出现的个数,TfidfVectorizer()统计的是特征的重要程度。1.TfidfVectorizer(stop_words=[“is”, “too”]),可以通过入参stop_words=[“is”, “too”]来控制不统计某些单词。

ls3614140的博客 1097

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

机器学习之特征工程

特征工程是数据分析中最耗时间和精力的一部分工作。数据和特征决定了机器学习的上限,而模型和算法则是逼近这个上限。因此,特征工程就变得尤为重要了。特征工程的主要工作就是对特征的处理,包括数据的采集,数据预处理,特征选择,甚至降维技术等跟特征有关的工作。

qq_52297180的博客 6768

【机器学习】带你搞懂什么是特征工程?(特征抽取&特征预处理&特征选择&数据降维)

带你搞懂什么是特征工程?特征工程什么是特征工程:特征工程的意义:特征抽取字典特征抽取:常用方法:One-hot编码:文本特征抽取:文档中词出现的个数:中文分词:tf-idf文本抽取:特征预处理:归一化:标准化:缺失值处理:特征选择和数据降维特征选择:过滤选择:PCA(主成分分析):主成分分析求解步骤:1. 获取方差最大的正交变换:2. 生成更多主成分: 特征工程 什么是特征工程: 特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。 比如原始数据可能非常庞大

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 5784

特征工程之降维

什么是降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 为什么降维 在实际的机器学习项目中,降维是必须进行的,因为在数据中存在以下几个方面的问题: (1)数据的多重共线性:特征属性之间存在着相互关联关系。多重共线性会导致解的空间不稳定, 从而导致模型的泛化能力弱; (2)高纬空间样本具有稀疏性,导致模型比较难找到数据特征; (3)过多的变量会妨碍模型查找规律...

smart_shi的博客 2823

【机器学习】特征工程快速入门

所有一切为了让模型效果变的更好的数据处理方式都可以认为属于特征工程这个范畴中的一个操作;至于需求做不做这个特征工程,需要我们在开发过程中不但的进行尝试。常规的特征工程需要处理的内容:异常数据的处理 删除、填充数据不平衡处理文本处理:词袋法、TF-IDF多项式扩展、哑编码、标准化、归一化、区间缩放法、PCA、特征选择…将均值、方差、协方差等信息作为特征属性,对特征属性进行对数转换、指数转换…结合业务衍生出一些新的特征属性…

ueke1的博客 1516

03 机器学习——特征工程

特征工程是机器学习中处理数据的关键步骤,通过专业技巧将数据转换为更适合算法的特征。主要包括特征提取、预处理和降维。在特征提取中,字典特征提取(如独热编码)将类别数据数值化;文本特征提取通过CountVectorizer统计词频或TfidfVectorizer计算词的重要性(TF-IDF)。TF-IDF衡量词在文档中的区分能力,公式结合词频(TF)和逆文档频率(IDF)。中文文本需借助jieba分词。特征工程直接影响模型效果,是机器学习流程中的重要环节。

mmmmm_111的博客 2021

机器学习实战之特征工程

机器学习介绍与特征工程1.机器学习概述1.1 什么是机器学习1.2 为什么要机器学习1.3 机器学习应用场景1.4 学习框架和资料的介绍2.特征工程2.1 特征工程介绍2.1.1 数据集的构成2.1.2 为什么需要特征工程(Feature Engineering)2.1.3 特征工程所需工具2.2 特征抽取2.2.1 特征提取2.2.2 字典特征提取2.2.3文本特征提取2.2.4 Tf-idf文...

weixin_39451323的博客 2231

AI学习---特征工程【特征抽取、特征预处理、特征降维】

学习框架 特征工程(Feature Engineering) 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 什么是特征工程: 帮助我们使得算法性能更好发挥性能而已 sklearn主要用于特征工程pandas主要用于数据清洗、数据处理 特征工程包含如下3个内容: 1、特征抽取/特征提取 |__>字典特征抽取...

weixin_30273501的博客 586

特征工程笔记

特征工程

每天进步一点 1452
上一篇: Supervisor在python3的使用
下一篇: Web 前端常用插件
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值