bubbleeee

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

SciKit learn的简称是SKlearn,是一个python库,专门用于机器学习的模块。官方网站:http://scikit-learn.org/stable/#
SKlearn包含的机器学习方式:分类,回归,无监督,数据降维,数据预处理等等,包含了常见的大部分机器学习方法。官网有一张图给了如何根据数据来选择转换器。(图源:https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)

 

 

 

sklearn-datasets

sklearn库的datasets模块集成了部分数据分析的经典数据集,常用数据集的加载函数和解释如下:

 

 1 from sklearn.datasets import load_breast_cancer
 2 # 波士顿房价-load_boston();糖尿病-load_diabetes();乳腺癌-load_breast_cancer()
 3 # 手写数字-load_digits();新闻分类-fetch_20newsgroups()
 4 cancer = load_breast_cancer()# 字典
 5 # data-数据;target-标签;feature_names-特征名称;DESCR-描述信息
 6 print("breast_cancer数据集长度:", len(cancer))
 7 print("breast_cancer数据集类型:", type(cancer))
 8 
 9 cancer_data = cancer.data
10 print("Breast_cancer数据集数据:", cancer_data)
11 print("Breast_cancer数据集数据长度:",len(cancer_data))
12 cancer_target = cancer.target
13 print("Breast_cancer数据集标签:", cancer_target)
14 cancer_names = cancer.feature_names
15 print("Breast_cancer数据集特征名称:", cancer_names)
16 cancer_desc = cancer.DESCR
17 print("Breast_cancer数据集的描述信息:", cancer_desc)

数据集划分:train_test_split(*array,**options):函数返回划分好的训练集和测试集数据。0.16版的新功能:如果输入是稀疏的,则输出将是scipy.sparse.csr_矩阵。否则,输出类型与输入类型相同。

 

 

 

cancer_data_train, cancer_data_test,cancer_target_train, cancer_target_test = train_test_split(cancer_data, cancer_target, test_size=0.2, random_state=111) 
print("训练集大小:", cancer_data_train.shape, cancer_target_train.shape)
print("测试集大小:", cancer_data_test.shape, cancer_target_test.shape)

 

数据预处理与降维

转换器:帮助用户方便实现大量的特征处理相关操作,sklearn把相关的功能封装成转换器。目前,使用sklearn的转换器能够实现对传入的Numpy数组进行标准化处理、归一化处理、二值化处理和PCA降维等处理。

转换器主要包含3种方法:

  • fit():训练算法,设置内部参数。
  • transform():数据转换。将规则应用于训练集或者测试集
  • fit_transform():合并fit和transform两个方法
在数据预处理中
fit(): Method calculates the parameters μ and σ and saves them as internal objects. 解释:简单来说,就是求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。 transform(): Method using these calculated parameters apply the transformation to a particular dataset. 解释:在fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。 fit_transform(): joins the fit() and transform() method for transformation of dataset. 解释:fit_transform是fit和transform的组合,既包括了训练又包含了转换。 transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等) fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。 根据对之前部分trainData进行fit的整体指标,对剩余的数据(testData)使用同样的均值、方差、最大最小值等指标进行转换transform(testData),从而保证train、test处理方式相同。

在算法模型中

以CountVectorizer为例(根据输入数据获取词频矩阵)

  •  fit(raw_documents) :根据CountVectorizer参数规则进行操作,比如滤除停用词等,拟合原始数据,生成文档中有价值的词汇表;\

源码中的desc

def fit(self, raw_documents, y=None):
    """Learn a vocabulary dictionary of all tokens in the raw documents."""

 

  • fit_transform(raw_documents, y=None):学习词汇词典并返回术语 - 文档矩阵(稀疏矩阵)。

源码中的desc

def fit_transform(self, raw_documents, y=None):
    """Learn the vocabulary dictionary and return term-document matrix.
       This is equivalent to fit followed by transform, but more efficiently implemented."""
  •  transform(raw_documents):使用符合fit的词汇表或提供给构造函数的词汇表,从原始文本文档中提取词频,转换成词频矩阵

源码中的desc

def transform(self, raw_documents):
    """Transform documents to document-term matrix.
        Extract token counts out of raw text documents using the vocabulary fitted with fit or the one provided to the constructor."""

 


以TfidfTransformer举例

  • fit(raw_documents, y=None):根据训练集生成词典和逆文档词频 由fit方法计算的每个特征的权重存储在model的idf_属性中。
  • transform(raw_documents, copy=True):使用fit(或fit_transform)学习的词汇和文档频率(df),将文档转换为文档-词矩阵。返回稀疏矩阵,[n_samples, n_features],即,Tf-idf加权文档矩阵(Tf-idf-weighted document-term matrix)
  • fit_transform(raw_documents[, y]):根据训练集生成词典和逆文档词频,返回Tf-idf加权文档矩阵。比fit+transform更高效。

 


 

总结:算法中的fit方法的应用等价于第一类的fit,只不过产生的结果意义不同(不是均值等统计意义,而是根据算法本身拟合获取不同信息以备后用),transform根据fit的结果转换成目标形式

 

 

 预处理函数(主要在sklearn.preprcessing包下)

规范化:

MinMaxScaler :最大最小值规范化

import pandas as pd
from sklearn.preprocessing import MinMaxScaler 
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
data = pd.DataFrame(data) 
#实现归一化
scaler = MinMaxScaler()           
#实例化
scaler = scaler.fit(data)         
#fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data)   
#通过接口导出结果
result
#训练和导出结果一步达成
result_ = scaler.fit_transform(data)                
#将归一化后的结果逆转 # 
scaler.inverse_transform(result)  
#使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中 
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler(feature_range=[5,10])         
#依然实例化
result = scaler.fit_transform(data)                 
#fit_transform一步导出结果
result

 


Normalizer :使每条数据各特征值的和为1

 

sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)

norm:可以为l1、l2或max,默认为l2

若为l1时,样本各个特征值除以各个特征值的绝对值之和

若为l2时,样本各个特征值除以各个特征值的平方之和

若为max时,样本各个特征值除以样本中特征值最大的值

from sklearn import preprocessing
X = [[ 1., -1., 2.], [ 2., 0., 0.],[ 0., 1., -1.]]

normalizer = preprocessing.Normalizer().fit(X)#fit does nothing
normalizer

normalizer.transform(X)

output:

Normalizer(copy=True, norm='l2')

array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

 


StandardScaler :为使各特征的均值为0,方差为1

from sklearn.preprocessing import StandardScaler  # 标准化工具
import numpy as np
 
x_np = np.array([[1.5, -1., 2.],
                [2., 0., 0.]])
scaler = StandardScaler()
x_train = scaler.fit_transform(x_np)
print('矩阵初值为:\n{}'.format(x_np))
print('该矩阵的均值为:\n{}\n 该矩阵的标准差为:{}'.format(scaler.mean_,np.sqrt(scaler.var_)))
print('标准差标准化的矩阵为:\n{}'.format(x_train))

output:

矩阵初值为:
[[ 1.5 -1.   2. ]
 [ 2.   0.   0. ]]
该矩阵的均值为:
[ 1.75 -0.5   1.  ]
 该矩阵的标准差为:[ 0.25  0.5   1.  ]
标准差标准化的矩阵为:
[[-1. -1.  1.]
 [ 1.  1. -1.]]

 


编码:(数据预处理函数)

LabelEncoder :把字符串类型的数据转化为整型

import numpy as np
import pandas as pd 
from sklearn import preprocessing

sex = pd.Series(["male", "female", "female", "male"])
le = preprocessing.LabelEncoder()    #获取一个LabelEncoder
le = le.fit(["male", "female"])      #训练LabelEncoder, 把male编码为0,female编码为1
sex = le.transform(sex)                #使用训练好的LabelEncoder对原数据进行编码
print(sex)

le.inverse_transform([1,0,0,1])
[1 0 0 1]

array(['male', 'female', 'female', 'male'],
      dtype='<U6')

 


OneHotEncoder :特征用一个二进制数字来表示

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit([[1],[2],[3],[4]])
ohe.transform([[2],[3],[1],[4]]).toarray()

output:

array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.]])

 

LabelEncoder 和 OneHotEncoder 的区别

LabelEncoder 将一列文本数据转化成数值;OneHotEncoder 将一列文本数据转化成一列或多列只有0和1的数据


Binarizer :对定量特征进行二值化处理,根据阈值将数值型转变为二进制型,阈值可以进行设定

from sklearn.preprocessing import Binarizer
df = pd.DataFrame(np.arange(12).reshape(4,3),columns=['A','B','C'])

binarize = Binarizer(threshold=5)
binarize.fit_transform(df)

output:

    A    B    C
0    0    1    2
1    3    4    5
2    6    7    8
3    9    10    11


array([[0, 0, 0],
       [0, 0, 0],
       [1, 1, 1],
       [1, 1, 1]])

 


MultiLabelBinarizer:多标签二值化

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(classes = [2,3,4,5,6,1]) # 注意这里加了classes参数
mlb.fit_transform([(1, 2), (3,4),(5,)])

output:

array([[1, 0, 0, 0, 0, 1],
       [0, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0]])

 


FunctionTransformer:对特征进行自定义函数变换

import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)

output:

array([[ 0.        ,  0.69314718],
       [ 1.09861229,  1.38629436]])

 

posted on 2021-11-04 10:43  bubbleeee  阅读(129)  评论(0编辑  收藏  举报