1. 数据挖掘五大流程
1. 获得数据
2. 数据预处理
3. 特征工程:
将原始数据转换成更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征(常以降维算法实现)来实现。
4. 建模
5. 上线
2.数据预处理 Preprocessing & Impute
- 可以是线性的,也可以是非线性的,线性包括中心化处理和缩放处理
- 中心化的本质:是让所有记录减去一个固定值,即让数据平移到某个位置。
- 缩放的本质:是通过除以一个固定值,将数据固定在某个范围之中,取对数也是一种缩放处理。
- 数据按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这一过程就叫数据归一最小化,在sklearn中使用preporcessing.MinMaxScaler来实现这个功能
preprocessing.MinMaxScaler
- (重要参数:feature_range 控制希望把数据压缩到的范围 默认[0,1])
from sklearn.preprocessing import MinMaxScaler
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.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)
#当x中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
#此时当使用partial_fit作为训练接口
#即 scaler = scaler.partial_fit(data)
result
(也可使用numpy实现归一化)
preprocessing.StandardScaler
数据标准化(StandardScaler): 数据按均值中心化后再按标准差缩放,数据会服从为均值为0,方差为1的正态分布。
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
#--------------------------------------------------------------
scaler = StandardScaler() #实例化
scaler.fit(data) #fit的本质是生成均值和反差
#scaler.mean_ 查看均值的属性mean_
#scaler.var_ 查看反差属性var_
x_std = scaler.transform(data) #通过接口导出结果
#x_std.mean() 导出结果是数组,用mean()查看均值 std()查看方差
#x_std.std()
#--------------------------↑_plan_1----------------------------
scaler.fit_transform(data)
#使用fit_transform(data)一步达成结果
#--------------------------↑_plan_2----------------------------
scaler.inverse_transform(x_std)
#使用inverse_transform逆转标准化
StandardScaler MinMaxScaler 选个?
- 大多机器学习算法会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。
- PCA、聚类、逻辑回归、支持向量机、神经网络中,StandarScaler往往是最好的选择。
- 建议先试试StandardScaler,效果不好换MinMaxScaler.
- 还有众多,可参考下表
2.2 缺失值
impute.SimpleImpute 类(包含四个参数)
- missing_values
告诉SimpleImpute,数据中的缺失值长什么样,默认空值np.nan - strategy
填补缺失值的策略,默认均值。
“mean” 使用均值填补 (仅对数值型特征可用)
“median” 用中值填补 (仅对数值型特征可用)
“most_frequent” 用众数填补 (对数值型和字符型特征都可用)
“constant” 表示请参考参数“fill_value”中的值 (对数值型和字符型特征都可用) - fill_value
当参数startegy为“constant”的时候可用,可输入字符串或数字表示要填充的值,常用0 - copy
默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。
import pandas as pd
data = pd.read_csv(r"C:\Users\Lin_Yu\Desktop\预处理数据\Narrativedata.csv",index_col=0)
#data.info() 可看出年龄需要填补
Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
#.values.reshape(-1,1)是一个NumPy函数,它会将一个一维数组(values)转换为一个二维数组,
#其中第二个维度的大小为 1。
#参数"-1"是用来告诉函数自动计算第一个维度的大小,以保证数组元素的数量不变。
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) #fit_transform 一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
data.loc[:,"Age"] = imp_median
#data.info()发现还有Embarker存在缺失,用众数填补
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
用pandas和 Numpy进行填补更简单
import pandas as pd
data = pd.read_csv(r"C:\Users\Lin_Yu\Desktop\预处理数据\Narrativedata.csv",index_col = 0)
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#运用.fillna直接进行填补
data.dropna(axis=0,inplace=True)
#axis=0删除所有有缺失值的行 axis=1 删除所有有缺失值的列
2.3 编码与哑变量 (将文字型数据转换为数值型)
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1] #要输入的是标签不是特征矩阵,故允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y)
# le.classes_ 查看获得的结果
# label 查看获得的结果
## le.fit_transform(y) 也可以一步到位
#le.inverse_transform(label) 逆转回标签
data.iloc[:,-1] = label
data.head()
preprocessing.OrdinalEncoder:特征专用,能够将分类特征转化为分类数值
from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()
preprocessing.OneHotEncoder:独热编码,创建哑变量
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories = 'auto').fit(X)
result = enc.transform(X).toarray()
#依旧可以还原
pd.DataFrame(enc.inverse_transform(result))
#enc.get_feature_names_out() 获取特征值名字
newdata = pd.concat([data,pd.DataFrame(result)],axis = 1)
newdata.drop(["Sex","Embarked"],axis = 1,inplace = True)
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head()
2.4 二值化与分段
sklearn.preprocessing.Binarizer
根据阈值将数据二值化,用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0.默认阈值为0时,特征中所有的正值都映射到1。
#将年龄二值化
data_2 = data.copy()
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold = 30).fit_transform(X)
preprocessing.KBinsDiscretizer
将连续性变量划分为分类变量的类,能够将连续性变量排序后按顺序分箱后编码。总共包含三个主要参数:
- n_bins
每个特征中分箱的个数,默认5 一次会被运用到所有导入的特征 - encode
默认为"onehot"
“onehot”:做哑变量,返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵
“onehot-dense”:做哑变量,之后返回一个密集数组。 - strategy
用来定义箱宽的方式,默认"quantile"
“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征max()-特征.min())/(n_bins)
“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同
“kmeans”:表示按举类分箱,每个箱中的值到最近的一维K均值聚类的簇心得距离都相同
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)
#查看转换后的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())
est=KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()