承接数据分析之数据探索
https://blog.csdn.net/qq_45626019/article/details/108074152
import pandas as pd
import numpy as np
housing=pd.read_csv(r"D:\sublime\机器学习\dataset\housing.csv")
#按照收入类别进行分层抽样
housing["income_cat"]=np.ceil(housing["median_income"]/1.5)
housing["income_cat"].where(housing["income_cat"]<5,5.0,inplace=True)
from sklearn.model_selection import StratifiedShuffleSplit
ss=StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=42)
for train_index,test_index in ss.split(housing,housing["income_cat"]):
strat_train_set=housing.iloc[train_index]
strat_test_set=housing.iloc[test_index]
#回到干净数据集,划分目标和特征属性(标签-对应数据)
housing=strat_train_set.drop("median_house_value",axis=1)
housing_label=strat_train_set['median_house_value'].copy()
在第一部分我们已经注意到有部分缺失数据,为适应机器学习算法,我们需要对缺失数据进行删除。
①放弃相应缺失数据
housing.dropna(subset=['total_bedrooms'])
②放弃属性
housing.drop('total_bedrooms',axis=1)
③对缺失值进行填充(0,均值等)
1、普通方法
mean=housing['total_bedrooms'].mean()
housing['total_bedrooms'].fillna(mean)
2、利用scikit-learn
from sklearn.impute import SimpleImputer
imputer=SimpleImputer(strategy='median')
#中位数只能在数值属性上计算,因此需要构建一个没有文本的数据副本
housing_num=housing.drop('ocean_proximity',axis=1)
#使用fit()方法将imputer实例适配到训练集
imputer.fit(housing_num)
#imputer仅仅只是计算了每个属性的中位数值,并将结果存储到其实例变量的statistics_中.
print(imputer.statistics_)
print(housing_num.median().values)
'''
[-118.51 34.26 29. 2119.5 433. 1164. 408.
3.5409 3. ]
'''
X=imputer.transform(housing)
housing_tr=pd.DataFrame(X,columns=housing_num.columns)
#处理文本和分类属性
①这里要用到scikit-learn 中的LabelEncoder函数,将文本标签转化为数字
补充:机器学习算法会误以为两个相近的数字比两个相距很远的数字更为相似。
from sklearn.preprocessing import LabelEncoder
encoder=LabelEncoder()
housing_cat=housing['ocean_proximity']
housing_cat_encoded=encoder.fit_transform(housing_cat)
print(housing_cat_encoded)
print(encoder.classes_)
'''
[0 0 4 ... 1 0 3]
['<1H OCEAN' 'INLAND' 'ISLAND' 'NEAR BAY' 'NEAR OCEAN']
'''
②为解决①中编码所出现的问题,scikit-learn提供一个OneHotEncoder(独热)编码器。
from sklearn.preprocessing import OneHotEncoder
encoder=OneHotEncoder()
housing_cat_1hot=encoder.fit_transform(housing_cat_encoded.reshape(-1,1))#我们不知道housing_cat_encoded的shape属性是多少,但是想让housing_cat_encoded变成只有一列,行数不知道多少.
print(housing_cat_1hot.toarray())
#补充:housing_cat_1hot返回的是稀疏矩阵
'''
[[1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 0. 1.]
...
[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]]
'''
③使用LabelBinarizer类可以一次性完成两个转换(从文本转化为整数类别,再从整数类别转化为独热向量)
from sklearn.preprocessing import LabelBinarizer
encoder=LabelBinarizer()
housing_cat_1hot=encoder.fit_transform(housing_cat)
print(housing_cat_1hot)
'''
[[1 0 0 0 0]
[1 0 0 0 0]
[0 0 0 0 1]
...
[0 1 0 0 0]
[1 0 0 0 0]
[0 0 0 1 0]]
'''
特征缩放
适应于各特征属性的值相差太大,如在本例中房间的总数是 10512,而收入中位数是0-15.
好处:提升模型的收敛速度,提升模型的精度(归一化很有必要,他可以让各个特征对结果做出的贡献相同。)
①最小最大缩放(移动数据,使所有特征都刚好位于 0 和 1 之间。)
- 处理方法:将特征缩放到给定的最小值和最大值之间,也可以将每个特征的最大绝对值转换至单位大小。这种方法是对原始数据的线性变换,将数据归一到[0,1]中间;
- 转换函数:x = (x-min) / (max-min);
- 适用性:适用于分布范围较稳定的数据,当新数据的加入导致max/min变化,则需重新定义;
- Outlier 的影响:因为outlier会影响最大值或最小值,因此对outlier非常敏感。
参数包括:min, max, copy
- min:默认为0,指定区间的下限;
- max:默认为1,指定区间的上限;
- copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。
属性包括:min_, scale_, data_min_, data_max_
- min_:每个功能调整为最小;
- scale_:每个特征数据的相对缩放;
- data_min_:每个特征在数据中出现的最小值;
- data_max_:每个特征在数据中心出现的最大值。
from sklearn.preprocessing import MinMaxScaler
cope_with=MinMaxScaler(feature_range=(0, 1)) #调节归一化后的范围
housing_guiyi = cope_with.fit_transform(housing_num)
print(housing_guiyi)
'''
[[0.24501992 0.50478215 0.7254902 ... 0.06292009 0.15201859 0.25 ]
[0.24103586 0.47927736 0.25490196 ... 0.02072442 0.40837368 1. ]
[0.71215139 0.02444208 0.58823529 ... 0.08588499 0.1629081 0.25 ]
...
[0.79183267 0.16471838 0.15686275 ... 0.14245706 0.19119736 0.5 ]
[0.6314741 0.1360255 0.58823529 ... 0.0660941 0.24569316 0.5 ]
[0.18924303 0.55579171 1. ... 0.11893204 0.21207294 0.5 ]]
'''
②标准化(确保每个特征的平均值为 0、方差为 1,使所有特征都位于同一量级。)
补充:使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。
- 处理方法:标准化数据减去均值,然后除以标准差,经过处理后数据符合标准正态分布,即均值为0,标准差为1;
- 转化函数:x = (x-mean) / std;
- 适用性:适用于本身服从正态分布的数据;
- Outlier 的影响:基本可用于有outlier的情况,但在计算方差和均值时outliers仍然会影响计算。
参数包括:with_mean, with_std, copy
- with_mean:布尔型,默认为 True,表示在缩放前将数据居中,当尝试在稀疏矩阵上时,这不起作用(并且会引发异常),因为将它们居中需要构建一个密集矩阵,在常见的用例中,该矩阵可能太大而无法容纳在内存中;
- with_std:布尔型,默认为True,表示将数据换算成单位方差(或等效的单位标准差);
- copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。
属性包括:mean_, scale_, var_, n_samples_seen_
- mean_:训练集中每个特征的平均值,当_mean=False时,为None;
- scale_:每个特征数据的相对缩放;
- var_:训练集中每个特征的方差,用于计算比例,当_ std =False时,为None;
- n_samples_seen_:每个特征处理的样本数。如没有丢失的样本,n_samples_seen_是一个整数,否则是一个数组,并将被重置或递增。
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
housing_standard = scaler.fit_transform(housing_num)
print(housing_standard)
'''
[[-1.15604281 0.77194962 0.74333089 ... -0.42069842 -0.61493744
-0.95445595]
[-1.17602483 0.6596948 -1.1653172 ... -1.02222705 1.33645936
1.89030518]
[ 1.18684903 -1.34218285 0.18664186 ... -0.0933178 -0.5320456
-0.95445595]
...
[ 1.58648943 -0.72478134 -1.56295222 ... 0.71315642 -0.3167053
-0.00620224]
[ 0.78221312 -0.85106801 0.18664186 ... -0.37545069 0.09812139
-0.00620224]
[-1.43579109 0.99645926 1.85670895 ... 0.3777909 -0.15779865
-0.00620224]]
'''
③正则化(它对每个数据点进行缩放,使得特征向量的欧式长度等于 1 。)
- 1-范数:向量各分量绝对值之和
- 2-范数:向量长度
- 最大范数:向量各分量绝对值的最大值
- p-范数的计算公式:||X||p=(|x1|p+|x2|p+…+|xn|p)1/p
- 其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准
- 常见用于文本分类和聚类、logistic回归中也会使用,有效防止过拟合
from sklearn.preprocessing import Normalizer
norm=Normalizer(copy=True,norm='l2')
housing_norm = norm.fit_transform(housing_tr)
print(housing_norm)
'''
[[-0.06794195 0.02078559 0.02118134 ... 0.18895989 0.00150733
0.00111481]
[-0.15798975 0.04800722 0.01814038 ... 0.14641878 0.00832047
0.00647871]
[-0.05170744 0.01445779 0.01367688 ... 0.20382968 0.00126273
0.00088238]
...
[-0.02149188 0.00629431 0.00166174 ... 0.14124817 0.00060419
0.00055391]
[-0.04830828 0.01384447 0.01269008 ... 0.14573127 0.00166301
0.00122807]
[-0.03522815 0.01086621 0.01496009 ... 0.18383655 0.00102851
0.00086308]]
'''
④稳健标准化 RobustScaler(使用具有鲁棒性的统计量缩放带有异常值(离群值)的数据)
- 处理方法:该缩放器删除中位数,并根据百分位数范围(默认值为IQR:四分位间距)缩放数据;
- IQR:是第1个四分位数(25%)和第3个四分位数(75%)之间的范围;
- 适用性:适用于包含许多异常值的数据;
- Outlier 的影响:RobustScaler 利用IQR进行缩放来弱化 outlier 的影响。
参数包括:with_centering, with_scaling, quantile_range, copy
- with_centering:布尔值,默认为 True,表示在缩放之前将数据居中。若使用稀疏矩阵时,这将导致转换引发异常,因为将它们居中需要建立一个密集的矩阵,在通常的使用情况下,该矩阵可能太大而无法容纳在内存中;
- with_scaling : 布尔值,默认为True,表示将数据缩放到四分位数范围;
- quantile_range : 元组,默认值为(25.0, 75.0)即 IQR,表示用于计算 scale_的分位数范围;
- copy : 布尔值,默认为True,可选参数,表示拷贝一份数据以避免在原数据上进行操作,若设置为 False 执行插入行规范化并避免复制。
属性包括:center_, scale_
- center_ :训练集中每个属性的中位数;
- scale_ :训练集中每个属性的四分位间距。
from sklearn.preprocessing import RobustScaler
scaler=RobustScaler()
housing_standard = scaler.fit_transform(housing_num)
print(housing_standard)
'''
[[-0.89182058 0.8015873 0.47368421 ... -0.21362229 -0.3842127
-0.5 ]
[-0.90237467 0.73809524 -0.78947368 ... -0.91331269 1.32272581
1. ]
[ 0.34564644 -0.39417989 0.10526316 ... 0.16718266 -0.31170501
-0.5 ]
...
[ 0.55672823 -0.04497354 -1.05263158 ... 1.10526316 -0.12334114
0. ]
[ 0.13192612 -0.11640212 0.10526316 ... -0.16099071 0.23951876
0. ]
[-1.03957784 0.92857143 1.21052632 ... 0.71517028 0.01565872
0. ]]
'''
补充:
- 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler或者均值归一化表现更好(避免不同量纲对方差、协方差计算的影响);
- 在不涉及距离度量、协方差、数据不符合正态分布、异常值较少的时候,可使用MinMaxScaler。(eg:图像处理中,将RGB图像转换为灰度图像后将其值限定在 [0, 255] 的范围);
- 在带有的离群值较多的数据时,推荐使用RobustScaler。
参考链接:
- https://www.wandouip.com/t5i410748/
- https://blog.csdn.net/m0_47478595/article/details/106402843?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase