数据挖掘的五大流程
1、获取数据
2、数据预处理
数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
数据预处理的目的:让数据适应模型,匹配模型的需求
3、特征工程
特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌
特征工程的目的:1) 降低计算成本,2) 提升模型上限
4. 建模
测试模型并预测出结果
5. 上线
验证模型效果
1、中心化处理(Zero-centered或者Mean-subtraction)
2、缩放处理(Scale)
中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
数据归一化(Normalization)
分式上面:数据的中心化
上面除以下面:数据的缩放
在sklearn中,我们使用preprocessing.MinMaxScaler来实现。MinMaxScaler有一个重要参数:feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。
from sklearn.preprocessing import MinMaxScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]] # 4行2列
# 实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #这里的本质是生成min(x)和max(x)
# 当X中的特征数量非常多的时候,fit就会报错,表示数据量太大了我计算不了
# 此时使用partial_fit作为训练接口
# scaler = scaler.partial_fit(data)
result = scaler.transform(data) #通过接口导出结果
result
array([[0. , 0. ],[0.25, 0.25],[0.5 , 0.5 ],[1. , 1. ]])
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)
array([[ 5. , 5. ],[ 6.25, 6.25],[ 7.5 , 7.5 ],[10. , 10. ]])
数据的标准化(Standardization)
当数据按均值中心化后,再按标准差缩放,数据就会服从为均值为0,方差为1的正太分布(标准正太分布),而这个过程,就叫数据的标准化。
from sklearn.preprocessing import StandardScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
scaler = StandardScaler() #实例化
scaler.fit(data)
x_std = scaler.transform(data)
# 可以使用.mean()和.var()查看到x_std的均值和方差为0和1
x_std为
array([[-1.18321596, -1.18321596],[-0.50709255, -0.50709255],[ 0.16903085, 0.16903085],[ 1.52127766, 1.52127766]])
对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。通常来说,我们输入的X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。
class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)
读取数据
import pandas as pd
data = pd.read_csv(r"F:\data\Narrativedata.csv",index_col=0) # index_col = 0 意思是把第0列当作索引
Age = data.loc[:,'Age'].values.reshape(-1,1) # sklearn中的特征矩阵必须是二维
data.info()
data.info()的结果
Int64Index: 891 entries, 0 to 890
Data columns (total 4 columns):
Age 714 non-null float64
Sex 891 non-null object
Embarked 889 non-null object
Survived 891 non-null object
dtypes: float64(1), object(3)
memory usage: 34.8+ KB
填补年龄(按均值,按中位数,按0)
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)
使用众数填补Embarked
# 使用众数填补Embarked
Embarked = data.loc[:,'Embarked'].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy='most_frequent')
data.loc[:,'Embarked'] = imp_mode.fit_transform(Embarked)
对于想丢弃的数据,可以使用pandas里的dropna来操作
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
data = data.dropna(axis=0,inplace=False)
将文字型数据转换为字符型
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1] # 要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) # transform接口调取结果
data.iloc[:,-1] = label #将data里的数据进行转变
查看标签中究竟有多少类别
le.classes_ # 属性.classes_ 查看标签中究竟有多少类别
以上代码是可以直接写成一句话的
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
from sklearn.preprocessing import OrdinalEncoder
data_ = data.copy()
接口 categories_对应LabelEncoder的接口classes_,一模一样的功能
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
代码结果为:
[array([‘female’, ‘male’], dtype=object), array([‘C’, ‘Q’, ‘S’], dtype=object)]
数据的处理其实也是一行代码就可以处理完
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
可以用.get_feature_names()查看对应的特征名称
enc.get_feature_names()
输出的结果是这样的:
array([‘x0_female’, ‘x0_male’, ‘x1_C’, ‘x1_Q’, ‘x1_S’],dtype=object)
还有一种更加直观的做法
import pandas as pd
# axis = 1 ,表示跨行进行合并,也就是将两表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.drop(["Sex","Embarked"],axis=1,inplace=True) # 删除 Sex和Embarked这两列
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head()
运行结果如下,是不是一目了然?
最后一张图,总结一下以上三种~的用法
这张表是变量的分类
from sklearn.preprocessing import Binarizer
data_2.iloc[:,0]=Binarizer(threshold=30).fit_transform(data_2.iloc[:,0].values.reshape(-1,1)) #30以上的为1,30以下的为0
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()# 可以看到他变成了哑变量