本文基于菜菜的机器学习
一般来说,当我们将数据导入模型的时候,无量纲化的可以帮我们去除量纲对模型的影响(决策树和随机森林不需要这样做,它可以处理大多数数据)
一般来说线性的无量纲化包括去中心化和缩放处理,中心化就是将原本的数据通过加减一个固定值使他进行平移,缩放就是对数据乘除一个固定值使其处于某一种范围之中,例如取对数。
上面这个肯定会很眼熟,代码实现还是老三样
fit()
处理数据from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data) #导出结果
或者也可以一步到位
result_ = scaler.fit_transform(data)
或者你也可以将数据归一化到其他范围
scaler = MinMaxScaler(feature_range=
[5,10])
result = scaler.fit_transform(data)
代码为
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler() #实例化
scaler.fit(data) #fit,本质是生成均值和方差
scaler.mean_ #查看均值
scaler.var_ #查看方差_
x_std = scaler.transform(data)
在大多数机器学习里都是选择标准化来进行特征缩放的。
而归一化对于异常值较为敏感,优点是便于计算,可以用在图像处理等方面。
首先导入菜菜给的泰坦尼克号数据
import pandas as pd
data = pd.read_csv(r"D:\2 菜菜的sklearn直播课件\预处理数据\Narrativedata.csv",index_col= 0)
Age = data.loc[: ,"Age"].values.reshape(-1,1)
data
是pandas的DataFrame结构data.loc[: ,"Age"]
是Age所在行,是一个字典形式的量,即索引对应年龄data.loc[: ,"Age"].values
取出了字典中所有值,即取出所有年龄,是一个一维数组data.loc[: ,"Age"].values.reshape(-1,1)
将其转化二维列向量,reshape(a,b)
指的是转化为a行b列的二维向量,其中-1代表自动计算。
依然是
SimpleImputer()
result = fit_transform(yourdata)
data.loc[:"Age"] = result
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0补
imp_mean = imp_mean.fit_transform(Age)
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
#在这里我们使用中位数填补Age
data.loc[:,"Age"] = imp_median
data.info()
#使用众数填补Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy ="most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
data.info()
data.loc[:,"Age"] = imp_median
这里是可以直接赋值的,虽然他两类型不同,一个是字典一个是二维数组
也可以直接用pands和numpy填补
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
也可以直接将缺失的数据丢掉
data.dropna(axis=
0,inplace=True)
axis = 0
代表对行操作,inplace = True
代表直接对原数据替换
其实就是将文字型变量转化为数值型
依然是三步:
LabelEncoder()
le.fit_transform(data.iloc[:,2])
data.iloc[:,2] = result
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
result = le.fit_transform(data.iloc[:,2])
data.iloc[:,2] = result
例如我们可以将上述数据二值化,大于30岁的赋值为1,小于30岁的赋值为0
嘿嘿,老三样,只是这次又得转为二维数组
from sklearn.preprocessing import Binarizer
X = data2.iloc[:,0].values.reshape(-1,1)
bn = Binarizer(threshold = 30)
result = bn.fit_transform(X)
这次KBinsDiscretizer()里面有几个重要参数
from sklearn.preprocessing import KBinsDiscretizer
X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)