intro
一般包自带的数据都是经过筛选,预测效果好,没有缺失等问题。
数据挖掘的五大流程:
- 获取数据
- 数据预处理:让数据适应模型,匹配模型的需求。
- 特征工程:将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
可能面对的问题:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌。
### sklearn中的数据预处理和特征工程
- 模块preprocessing:几乎包含数据预处理的所有内容模块
- 模块Impute:填补缺失值专用
- 模块feature_selection:包含特征选择的各种方法的实践
- 模块decomposition:包含降维算法
数据预处理
数据无量纲化
- 梯度和矩阵为核心的算法中(逻辑回归,支持向量机,神经网络),无量纲化可以加快求解速度;
- 距离类模型(K近邻,K-Means聚类)无量纲化可以提升模型精度
无量纲化包括线性和非线性。
线性无量纲化包括中心化处理和缩放处理。
归一化Normalization
归一化服从正态分布。
在sklearn中,使用preprocessing.MinMaxScaler来实现这个功能。参数feature_range控制目标压缩范围,默认[0,1]
标准化Standardization
preprocessing.StandardScaler
对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。
一般选择StandardScaler来进行缩放,MinMaxScaler对异常值敏感。
代码
MinMaxScaler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from sklearn.preprocessing import MinMaxScaler data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] import pandas as pd pd.DataFrame(data)
scaler = MinMaxScaler() scaler = scaler.fit(data) result = scaler.transform(data)
result_ = scaler.fit_transform(data) scaler.inverse_transform(result)
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] scaler = MinMaxScaler(feature_range=[5,10]) result = scaler.fit_transform(data)
|
StandardScaler
1 2 3 4 5 6 7 8 9 10 11 12
| from sklearn.preprocessing import StandardScaler data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] scaler = StandardScaler() scaler.fit(data) scaler.mean_ scaler.var_ x_std = scaler.transform(data) x_std.mean() x_std.std() scaler.fit_transform(data) scaler.inverse_transform(x_std)
|
缺失值
以泰坦尼克号数据为例:一个数值型,两个字符型。
1 2 3
| import pandas as pd data = pd.read_csv(r"D:\Sklearn\Narrativedata.csv",index_col=0) data.head()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| data.info()
Age = data.loc[:,"Age"].values.reshape(-1,1) Age[:20] from sklearn.impute import SimpleImputer imp_mean = SimpleImputer() imp_median = SimpleImputer(strategy="median") imp_0 = SimpleImputer(strategy="constant",fill_value=0) imp_mean = imp_mean.fit_transform(Age) imp_median = imp_median.fit_transform(Age) imp_0 = imp_0.fit_transform(Age) imp_mean[:20] imp_median[:20] imp_0[:20]
data.loc[:,"Age"] = imp_median data.info()
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1) imp_mode=SimpleImputer(strategy="most_frequent") data.loc[:,"Embarked"]=imp_mode.fit_transform(Embarked) data.info()
|
处理分类型特征:编码与哑变量
sklearn中必须导入数值型
文字型转化为数值型
preprocessing
- preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
- preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
- preprocessing.OneHotEncoder:独热编码,创建哑变量
不同性质的分类数据: - 取值互相独立 - 有序变量:例如大学、高中、小学
- 有距变量:可计算
OrdinalEncoder用来处理有序变量,对于名义变量,要使用独热编码
1 2 3 4 5 6 7 8 9 10 11 12
| 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()
|
1 2 3 4 5 6 7
| from sklearn.preprocessing import OrdinalEncoder
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()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| data.head() from sklearn.preprocessing import OneHotEncoder X = data.iloc[:,1:-1] enc = OneHotEncoder(categories='auto').fit(X) result = enc.transform(X).toarray() result OneHotEncoder(categories='auto').fit_transform(X).toarray() pd.DataFrame(enc.inverse_transform(result)) enc.get_feature_names() result result.shape
newdata = pd.concat([data,pd.DataFrame(result)],axis=1) newdata.head() newdata.drop(["Sex","Embarked"],axis=1,inplace=True) newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"] newdata.head()
|
处理连续型特征:二值化与分段
preprocessing.Binarizer
二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(eg.使用贝叶斯设置中的伯努利分布建模)
1 2 3 4 5 6
| 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) transformer
|