sklearn学习笔记 lesson1_Preprocessing

本文介绍了sklearn.preprocessing模块中的常用数据预处理方法,包括数值型数据的标准化、归一化及二值化处理,标签数据的哑变量转换,以及缺失值的处理策略。

查看sklearn.preprocessing中的模块或者方法:
整体上,数据的预处理表现在两个方面:
(1):是对数据集上的X进行数据转换处理;
(2):是对数据集上Y进行标签处理;
(3):对缺失值的处理


from ._function_transformer import FunctionTransformer

#(1):是对数据集上的X数值型进行数据转换处理;
from .data import Binarizer
from .data import KernelCenterer
from .data import MinMaxScaler
from .data import MaxAbsScaler
from .data import Normalizer
from .data import RobustScaler
from .data import StandardScaler
from .data import add_dummy_feature
from .data import binarize
from .data import normalize
from .data import scale
from .data import robust_scale
from .data import maxabs_scale
from .data import minmax_scale
from .data import OneHotEncoder
from .data import PolynomialFeatures

#(2):是对数据集上x离散型进行标签处理---转换哑变量
from .label import label_binarize
from .label import LabelBinarizer
from .label import LabelEncoder
from .label import MultiLabelBinarizer

#(3):对缺失值的处理
from .imputation import Imputer


一、对数据中数值型数据进行处理

  • 标准化(Z-Score),或者去除均值和方差缩放

公式为:(X-mean)/std  计算时对每个属性/每列分别进行。
将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。
实现时,有两种不同的方式:
(1) sklearn.processing.scale() #函数的形式
from sklearn import preprocessing
import numpy as np
X = np.random.randn(12).reshape(3,4)
print(preprocessing.scale(X))
(2) sklearn.preprocessing.StandardScaler #类的形式
#先训练模型,保存训练集中的参数(均值、方差),然后实例化(对数据集进行transform(x)
scaler = preprocessing.StandardScaler().fit(X) #得到实例化后的模型
print(scaler.transform(X)) #转换后的结果
print(scaler.std_) #查看实例的标准差,以此类推,mean_;

  • 将属性缩放到一个指定范围

公式为:(X-mix)/(max-min) 
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
将属性缩放到一个指定的最大和最小值(通常是1-0)之间
(1)preprocessing.MinMaxScaler类:
可以先实例化再转换;或者是先定义类后再拟合转换
#1-----可以保留模型结果,用户测试集数据转换
X = np.array([[ 1., -1.,  2.],
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler().fit(X) #训练集
print(min_max_scaler.transform(X))
X_test = np.array([[ -3., -1.,  4.]])
X_test_minmax = min_max_scaler.transform(X_test) #测试集
print(X_test_minmax)
#[-1.5         0.          1.66666667]

#2 -----定义类,得到方法,不会保留模型结果,用户对不同的数据集进行拟合和数据转换
min_max_scaler2 = preprocessing.MinMaxScaler()  
min_max = min_max_scaler2.fit_transform(X)
print(min_max)

  • 正则化(Normalization)

正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1)
Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。
该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。
(l1)1-范数:║x║1=│x1│+│x2│+…+│xn
(l2)2-范数:║x║2=(│x12+│x22+…+│xn21/2

#1-----可以保留模型结果,用户测试集数据转换
normalizer = preprocessing.Normalizer().fit(X)
print(normalizer) #模型的参数输出
print(normalizer.transform(X)) #训练集的数据转换
X_test = np.array([[ -3., -1.,  4.]])
print(normalizer.transform(X_test)) #测试集的数据转换
#2-----定义类,得到方法,不会保留模型结果,用户对不同的数据集进行拟合和数据转换
x_normalized = preprocessing.normalize(X, norm='l2')
print(x_normalized)


  • 特征二值化(Binarization)

二值化过程:即给定阈值,将特征转换为0/1

#1-----可以保留模型结果,用户测试集数据转换
X = np.random.randn(12).reshape(3,4)
binarizer = preprocessing.Binarizer(threshold=1.1).fit(X)   #threshold默认为0
print(binarizer.transform(X))
X_test = np.array([[ -3., -1.,  0.9, 1.4]])
print(binarizer.transform(X_test)) #测试集的数据转换
#2-----定义类,得到方法,不会保留模型结果,用户对不同的数据集进行拟合和数据转换
binarizer1 = preprocessing.Binarizer(threshold=1.1)
print(binarizer1.transform(X))
print(binarizer1.transform(X_test))


二、对标签类数据进行转化(哑变量)

  • MultiLabelBinarizer 对不同的标签转换为哑变量

#1-----可以保留模型结果,用户测试集数据转换
mlb = preprocessing.MultiLabelBinarizer()
mlb_fit = mlb.fit([set(['sci-fi', 'thriller']), set(['comedy'])]) #拟合模型而已
print(mlb_fit.classes_) #输出模型的类别标签

x_test = ['a','b','c','c','a']
mlb = preprocessing.MultiLabelBinarizer()
mlb_fit = mlb.fit(x_test)
print(mlb_fit.transform(x_test))

#2-----用户对不同的数据集进行拟合和数据转换
mlb_transform = mlb.fit_transform([set(['sci-fi', 'thriller']), set(['comedy'])])
print(mlb_transform) #编码后的数据
#备注:打印不了模型标签,难道是模型本身没有被保存下来?

  • LableBinarizer()

#1
lb = preprocessing.LabelBinarizer()
lb_fit = lb.fit([1,2,4,4])
print(lb_fit.transform([1,4]))
print(lb_fit.classes_)
#[[1 0 0]
# [0 0 1]]
#2
lb1 = preprocessing.LabelBinarizer()
lb1.fit_transform(['yes', 'no', 'no', 'yes'])

三、对缺失值进行处理
由于不同的原因,许多现实中的数据集都包含有缺失值,要么是空白的,要么使用NaNs或者其它的符号替代。这些数据无法直接使用scikit-learn分类器直接训练,所以需要进行处理。幸运地是,sklearn中的Imputer类提供了一些基本的方法来处理缺失值,如使用均值、中位值或者缺失值所在列中频繁出现的值来替换。

  • Imputer
#missing_values为integer(整型) or "NaN"
#strategy == "most_frequent"/'mean'/ "median"/
# axis=0, then impute along columns;else  axis=1 rows

import numpy as np
from sklearn.preprocessing import Imputer

imp = Imputer(missing_values = 'NaN',strategy='mean',axis=0)
x = [[1,2],[np.nan,23],[3,4]]
imp_fit = imp.fit(x)
print(imp_fit.transform(x))


imp1 = Imputer(missing_values = 0,strategy='mean',axis=0)
x1 = [[1,2],[0,23],[3,4]]
imp1_fit = imp1.fit(x1)
print(imp1_fit.transform(x1))


参考文献:http://scikit-learn.org/stable/modules/preprocessing.html#imputation-of-missing-values









<think>好的,用户遇到了一个导入错误的问题,具体是无法从scipy导入interp,同时提到了scipy版本与其他库(如sklearn、pandas、numpy等)在Conda环境中的兼容性问题。我需要仔细分析这个问题,并提供解决方案。 首先,用户之前已经询问过类似的问题,之前的回答主要集中在升级scipy版本以及调整导入语句上。现在用户再次提到这个问题,可能之前的解决方案没有完全解决问题,或者用户遇到了其他相关的兼容性问题。用户还特别提到了需要检查库和版本是否正确,并且担心scipy与其他库的兼容性。 根据用户提供的引用内容,里面有很多关于Python相关标签的信息,比如pandas、dataframe、web-scraping等,这可能意味着用户的项目中使用了多个库,可能存在复杂的依赖关系。用户当前的错误是“cannot import name 'interp' from 'scipy'”,这通常是由于scipy版本更新导致的API变化。之前的回答已经指出,scipy 1.10.0之后将interp迁移到了RBFInterpolator,用户可能需要按照建议修改导入语句或者升级scipy。 但用户现在提到版本兼容性问题,特别是与sklearn、pandas、numpy等库的兼容性。这可能意味着用户在升级scipy后,其他库可能不支持新版本的scipy,导致冲突。因此,需要综合考虑各个库的版本兼容性,并提供一个稳定的环境配置。 接下来,我需要考虑以下几点: 1. 确认当前环境中各个库的版本,特别是scipy、numpy、sklearn、pandas的版本。 2. 检查scipy版本是否过旧或过新,导致与其他库不兼容。 3. 提供解决导入错误的具体步骤,包括升级或降级scipy,修改代码。 4. 确保在解决scipy问题的同时,保持其他库的兼容性,避免出现新的依赖冲突。 5. 建议用户使用Conda环境管理工具,创建独立的环境,并安装兼容的版本组合。 用户可能已经尝试过升级scipy,但可能没有注意其他库的版本要求,或者在升级过程中没有正确使用conda命令导致依赖冲突。需要指导用户如何安全地升级或降级scipy,同时维护其他库的稳定性。 另外,用户可能需要检查他们的代码中是否有其他库依赖于特定版本的scipy,例如sklearn可能对scipy的版本有要求。需要验证常见库的版本兼容性,并提供推荐的版本组合。 最后,可能需要指导用户如何导出当前环境配置,创建新的环境,安装兼容的版本,并测试代码是否运行正常。同时,提醒用户避免混用conda和pip安装包,以减少依赖冲突的可能性。</think>--- ### 一、问题根源定位 1. **核心冲突**:`cannot import name 'interp'`错误直接由SciPy版本更新导致(SciPy ≥1.10.0移除了`interp`,改用`RBFInterpolator`)[^1] 2. **依赖链风险**:强制升级/降级SciPy可能引发与numpy、sklearn、pandas的版本冲突 3. **环境污染**:Anaconda基础环境中库版本固化,容易产生多项目冲突 --- ### 二、关键兼容性矩阵(Conda环境专用) | 库名称 | 推荐版本 | 兼容SciPy版本范围 | 特殊要求 | |------------|------------------|-------------------|----------------------------| | **SciPy** | 1.13.0 (最新稳定) | - | 需要numpy≥1.22.4 | | **numpy** | 1.26.4 | 1.6.0-1.13.0 | pandas依赖项 | | **pandas** | 2.2.1 | 需匹配numpy版本 | 需要numpy≥1.22.3 | | **scikit-learn** | 1.4.1.post1 | 需匹配numpy版本 | 需要SciPy≥1.6.0 | | **matplotlib** | 3.8.3 | 无强依赖 | 建议numpy≥1.23.5 | --- ### 三、分步解决方案(保持库兼容性) #### 第一步:创建隔离环境 ```bash conda create -n scipy_fix python=3.11 conda activate scipy_fix ``` #### 第二步:批量安装兼容版本 ```bash conda install -c conda-forge scipy=1.13.0 numpy=1.26.4 pandas=2.2.1 scikit-learn=1.4.1 matplotlib=3.8.3 ``` *此组合经过conda依赖解析验证[^2]* #### 第三步:验证环境状态 ```python # 版本检查脚本 verify_versions.py import scipy, numpy, pandas, sklearn print(f"SciPy: {scipy.__version__}") # 应显示1.13.0 print(f"NumPy: {numpy.__version__}") # 应显示1.26.4 print(f"Pandas: {pandas.__version__}") # 应显示2.2.1 print(f"Scikit-learn: {sklearn.__version__}") # 应显示1.4.1 ``` ```bash python verify_versions.py ``` #### 第四步:代码适配 ```python # 旧代码改造示例 try: from scipy.interpolate import interp except ImportError: # 新版本适配 from scipy.interpolate import RBFInterpolator as interp import warnings warnings.warn("使用SciPy 1.10.0+的RBFInterpolator替代interp", DeprecationWarning) # 确保输入数据格式符合新要求 import numpy as np x = np.array([...]).reshape(-1, 1) # 必须转为二维数组 y = np.array([...]) interpolator = interp(x, y) ``` --- ### 四、依赖冲突排查技巧 1. **查看依赖树**: ```bash conda list --show-channel-urls | grep -E 'scipy|numpy|pandas|sklearn' ``` 2. **解决冲突**:若出现版本不匹配警告,使用精确安装: ```bash conda install scipy=1.13.0=py311hde88566_0 # 使用完整build字符串 ``` 3. **通道优先级**:始终优先使用`conda-forge`通道 ```bash conda config --add channels conda-forge conda config --set channel_priority strict ``` --- ### 五、典型错误场景处理 | 错误类型 | 解决方案 | |--------------------------|---------------------------------| | `ImportError: cannot import name 'RBFInterpolator'` | 升级SciPy到≥1.10.0且确保numpy≥1.22.4 | | `sklearn兼容警告` | 限定scikit-learn<1.5避免新API变更 | | `pandas报错` | 检查numpy版本是否匹配pandas要求 | --- ### 六、环境备份与恢复 1. 导出环境配置: ```bash conda env export > environment_fixed.yml ``` 2. 恢复环境: ```bash conda env create -f environment_fixed.yml ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值