zoukankan      html  css  js  c++  java
  • [特征工程]常用功能实现

    前言:特征工程是机器学习流程中的重要步骤,是数据预处理阶段的主要内容。

    本文汇总了特征工程最常用功能的具体实现方式,方便快速查询使用。(我不会编写代码,我只是代码的复制粘贴工)

    1.特征归一化处理:零均值归一化、线性函数归一化、二值化

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import sklearn
     5 
     6 from sklearn import preprocessing
     7 
     8 X_train = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
     9 
    10 #1.使用scale,进行“零均值归一化”
    11 X_scaled = preprocessing.scale(X_train)
    12 
    13 #2.使用StandardScaler,进行“零均值归一化”
    14 X_scaled = preprocessing.StandardScaler().fit_transform(X_train)
    15 
    16 #3.使用MinMaxScaler,进行“线性函数归一化,0~+1区间”
    17 X_scaled = preprocessing.MinMaxScaler(feature_range=(0,1)).fit_transform(X_train)
    18 
    19 #4.对数值特征进行“0-1二值化”,大于threshold的都变成1,小于等于threshold的都变成0
    20 X_scaled = preprocessing.Binarizer(threshold=0.0).fit_transform(X_train)

    2.类别型特征处理:序号编码、独热编码、标签二值化编码

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import sklearn
     5 
     6 from sklearn import preprocessing
     7 
     8 X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
     9 
    10 #1.使用OrdinalEncoder进行“序号编码”
    11 enc = preprocessing.OrdinalEncoder().fit(X)
    12 Y = [['female', 'from US', 'uses Safari']]
    13 result = enc.transform(Y)
    14 
    15 #2.使用OneHotEncoder进行“独热编码”
    16 enc = preprocessing.OneHotEncoder().fit(X)
    17 Y = [['female', 'from US', 'uses Safari'],['male', 'from Europe', 'uses Safari']]
    18 result = enc.transform(Y)
    19 
    20 #3.LabelBinarizer
    21 enc = preprocessing.LabelBinarizer().fit(np.array([[0, 1, 1], [1, 0, 0]]))
    22 Y = [0, 1, 2, 1]
    23 result = enc.transform(Y)

    3.高维组合特征处理:矩阵特征值分解、矩阵奇异值分解

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import sklearn
     5 
     6 from sklearn.decomposition import TruncatedSVD
     7 from sklearn.random_projection import sparse_random_matrix
     8 
     9 ##1. numpy实现矩阵分解——特征值分解
    10 from numpy.linalg import eig
    11 #生成随机值矩阵 (4,4)大小
    12 A = np.random.randint(-10,10,(4,4))
    13 #矩阵与其转置相乘,得到对称正定矩阵
    14 C = np.dot(A.T, A)
    15 #矩阵分解
    16 vals, vecs = eig(C)
    17 ##特征值
    18 print('矩阵分解的特征值为:')
    19 print(vals)
    20 ##特征向量
    21 #print(vecs)
    22 print()
    23 
    24 ##2. numpy实现矩阵分解——奇异值分解
    25 from numpy.linalg import svd
    26 B = np.random.randint(-10,10,(4, 3)).astype(float)
    27 #SVD分解
    28 U,Sigma,V_trans = np.linalg.svd(B)
    29 #print(U)
    30 #奇异值组成的对角矩阵
    31 print('奇异值分解的奇异值为:')
    32 print(Sigma)
    33 #print(V_trans)
    34 print()
    35 
    36 ##3. sk-learn中的TruncatedSVD
    37 ##生成一个稀疏矩阵
    38 X = sparse_random_matrix(100, 100, density=0.01, random_state=42)
    39 ##<class 'scipy.sparse.csr.csr_matrix'>
    40 #print(type(X))
    41 ##<class 'numpy.ndarray'>
    42 #print(type(X.A))
    43 ##存储到文件中
    44 #np.savetxt('X.txt',X.A)
    45 ##对于稀疏矩阵,使用TruncatedSVD进行降维,提取出低维的有效特征
    46 ##n_components:期望的输出数据维数。必须严格小于功能的数量。默认值为2,对于可视化非常有用。对于LSA,建议值为100。
    47 svd = TruncatedSVD(n_components=5, n_iter=7, random_state=42)
    48 svd.fit(X)
    49 #print(svd.explained_variance_)
    50 #print(svd.explained_variance_ratio_)
    51 ##奇异值
    52 print('使用learn中的TruncatedSVD得到最大的n个的奇异值:')
    53 print(svd.singular_values_)
    54 print()

    4.特征选择:基于L1正则化的特征选择,基于树的特征选择

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import sklearn
     5 
     6 ##1. 使用L1正则化进行特征选择
     7 from sklearn.svm import LinearSVC
     8 from sklearn.datasets import load_iris
     9 from sklearn.feature_selection import SelectFromModel
    10 iris = load_iris()
    11 X, y = iris.data, iris.target
    12 print(X.shape)
    13 
    14 lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
    15 model = SelectFromModel(lsvc, prefit=True)
    16 X_new = model.transform(X)
    17 print(X_new.shape)
    18 print()
    19 
    20 
    21 ##2. 使用基于树的特征选择
    22 from sklearn.ensemble import ExtraTreesClassifier
    23 from sklearn.datasets import load_iris
    24 from sklearn.feature_selection import SelectFromModel
    25 iris = load_iris()
    26 X, y = iris.data, iris.target
    27 print(X.shape)
    28 
    29 clf = ExtraTreesClassifier(n_estimators=50)
    30 clf = clf.fit(X, y)
    31 print(clf.feature_importances_)
    32 
    33 model = SelectFromModel(clf, prefit=True)
    34 X_new = model.transform(X)
    35 print(X_new.shape)

    5.词袋模型(BOW):词频模型,TF-IDF模型,hash编码模型

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import sklearn
     5 
     6 ##1. 词袋模型——词频
     7 from sklearn.feature_extraction.text import CountVectorizer
     8 text = ["The quick brown fox jumped over the lazy dog."]
     9 # 创建transform
    10 vectorizer = CountVectorizer()
    11 ## 使用 N-gram模型拆分
    12 #vectorizer = CountVectorizer(ngram_range=(2, 2), decode_error="ignore",token_pattern = r'w+',min_df=1)
    13 # 分词并建立词汇表
    14 vectorizer.fit(text)
    15 # 结果输出
    16 print(vectorizer.vocabulary_)
    17 vector = vectorizer.transform(text)
    18 # 输出编码后的向量信息
    19 print(vector.shape)
    20 print(type(vector))
    21 print(vector.toarray())
    22 print()
    23 
    24 ##2. 词袋模型——词频-逆文档频率模型
    25 from sklearn.feature_extraction.text import TfidfVectorizer
    26 text = ["The quick brown fox jumped over the lazy dog.","The dog.","The fox"]
    27 vectorizer = TfidfVectorizer()
    28 vectorizer.fit(text)
    29 print(vectorizer.vocabulary_)
    30 #逆文档频率:
    31 print(vectorizer.idf_)
    32 vector = vectorizer.transform([text[0]])
    33 print(vector.shape)
    34 #文档0的tf-idf得分(0~1之间):
    35 print(vector.toarray())
    36 print()
    37 
    38 ##3. 词袋模型——hash向量编码:
    39 from sklearn.feature_extraction.text import HashingVectorizer
    40 # 文件列表
    41 text = ["The quick brown fox jumped over the lazy dog."]
    42 # 创建transform
    43 vectorizer = HashingVectorizer(n_features=20)
    44 # 编码文件
    45 vector = vectorizer.transform(text)
    46 # 输出编码后的结果
    47 print(vector.shape)
    48 print(vector.toarray())

    6.Word2Vec词嵌入:gensim版

     1 import numpy as np
     2 import pandas as pd
     3 import matplotlib as mpl
     4 import gensim
     5 
     6 texts = [['human', 'interface', 'computer'],
     7 ['survey', 'user', 'computer', 'system', 'response', 'time'],
     8 ['eps', 'user', 'interface', 'system'],
     9 ['system', 'human', 'system', 'eps'],
    10 ['user', 'response', 'time'],
    11 ['trees'],
    12 ['graph', 'trees'],
    13 ['graph', 'minors', 'trees'],
    14 ['graph', 'minors', 'survey']]
    15 
    16 # dictionary = gensim.corpora.Dictionary(texts)
    17 # corpus = [dictionary.doc2bow(text) for text in texts]
    18 # print(corpus[0]) # [(0, 1), (1, 1), (2, 1)]
    19 # tfidf = models.TfidfModel(corpus)
    20 
    21 # #参数说明:
    22 # (1) sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
    23 # (2) size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,视语料库的大小而定。
    24 # (3) alpha: 是初始的学习速率,在训练过程中会线性地递减到min_alpha。
    25 # (4) window:即词向量上下文最大距离,skip-gram和cbow算法是基于滑动窗口来做预测。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。对于一般的语料这个值推荐在[5,10]之间。
    26 # (5) min_count::可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。
    27 # (6) max_vocab_size: 设置词向量构建期间的RAM限制,设置成None则没有限制。
    28 # (7) sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。
    29 # (8) seed:用于随机数发生器。与初始化词向量有关。
    30 # (9) workers:用于控制训练的并行数。
    31 # (10) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每    轮的迭代步长可以由iter,alpha, min_alpha一起得出。对于大语料,需要对alpha, min_alpha,iter一起调参,来选                        择合适的三个值。
    32 # (11) sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。
    33 # (12)hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
    34 # (13) negative:如果大于零,则会采用negativesampling,用于设置多少个noise words(一般是5-20)。
    35 # (14) cbow_mean: 仅用于CBOW在做投影的时候,为0,则采用上下文的词向量之和,为1则为上下文的词向量的平均值。默认值也是1,不推荐修改默认值。
    36 # (15) hashfxn: hash函数来初始化权重,默认使用python的hash函数。
    37 # (16) iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
    38 # (17) trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)。
    39 # (18) sorted_vocab: 如果为1(默认),则在分配word index 的时候会先对单词基于频率降序排序。
    40 # (19) batch_words:每一批的传递给线程的单词的数量,默认为10000。
    41 
    42 model = gensim.models.word2vec.Word2Vec(texts, size=5, hs=1, min_count=1, window=3)
    43 
    44 #1. 计算两个词向量的相似度
    45 sim1 = model.similarity(u'human', u'trees')
    46 sim2 = model.similarity(u'human', u'computer')
    47 print(sim1,sim2)
    48 print()
    49 
    50 #2. 与某个词(human)最相近的5个词
    51 for key in model.similar_by_word(u'human', topn=5):
    52     print(key)
    53 print()
    54 
    55 #3. 计算某个词(human)的相关列表
    56 sim3 = model.most_similar(u'human', topn=5)
    57 for key in sim3:
    58     print(key)
    59 print()
    60 
    61 #4. 找出与众不同的词
    62 sim4 = model.doesnt_match(['human','interface','time'])
    63 print(u'不同匹配的词是', sim4)
  • 相关阅读:
    JavaScript-Runoob-JS函数:JavaScript 函数调用
    JavaScript-Runoob-JS函数:JavaScript 函数参数
    JavaScript-Runoob-JS函数:JavaScript 函数定义
    JavaScript-Runoob:JavaScript 代码规范
    Serverless架构的前世今生
    【华为云技术分享】STM32L476移植华为LiteOS系列教程(二)---开发前准备
    8分钟为你详解React、Angular、Vue三大前端技术
    【华为云技术分享】云容器引擎 CCE权限管理实践
    【极客思考】设计模式:你确定你真的理解了单例模式吗?
    最终,我决定将代码迁出x86架构!
  • 原文地址:https://www.cnblogs.com/asenyang/p/11197256.html
Copyright © 2011-2022 走看看