python数据预处理_⽤python进⾏数据预处理简介
常见的数据挖掘的⼿段
数据加载与粗略查看
处理丢失的数据
处理偏离值
数据统计
特征值的合并、连接
数据转换、标准化、归⼀化
1. 主要介绍
2.1数据加载与粗略查看
2.1.1数据加载
⼀般训练与测试的数据都提供csv格式,使⽤pandas库读取:
1. df_train = pd.read_csv('../train.csv')
此时读取的df_train为DataFrame格式。
同时pandas还可以读取各种不同格式的数据,如存储⽐较快的hdf格式、excel等
但有时数据不是简单的csv,它按照⽂本保存,如“ID||texttexttexttext”这样的⼀条数据需要将中间的“||”当作分隔符,读取⽅式如下:
更多参数应该查阅pandas⽂档。
2.1.2数据粗略查看
在pandas读进来数据⼀个train后,train的格式为DataFrame,调⽤下⾯的⼏个⽅法就可以⼤致了解我们得到的数据是什么,有什么特征值,特征值的数据类型是什么,如果是数值那么最⼤最⼩值是什么等:
train.head(5) #显⽰前5⾏数据
train.tail(5) #显⽰后5⾏
train.shape #查看数据集⾏列分布,⼏⾏⼏列
train.describe() #查看数据的⼤体情况
如train.describe():
2.2处理丢失的数据
处理这些数据以前不建议把train与test 连接起来,因为这样容易造成test⾥数据的丢失,个⼈认为较好的⽅式为:full_data = [train, test]
将两个数据集合成为list,然后清洗时对其for循环即可,如:
for dataset in full_data:
dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
下⾯只介绍对测试集train 的操作。
到丢失的位置
输出每个列丢失值也即值为NaN的数据和,并从多到少排序:
total = train.isnull().sum().sort_values(ascending=False)
python新手代码useridprint(total)
Cabin 687
Age 177
Embarked 2
Fare 0
Ticket 0
Parch 0
SibSp 0
Sex 0
Name 0
Pclass 0
Survived 0
PassengerId 0
也可以输出百分⽐:
percent =(train.isnull().sum()/train.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)
由此可以看到‘Cabin’的缺失数量最多,‘Embarked’最少。
2.2.1缺失值得处理
对缺失数据的处理我们有很多⽅法,如《机器学习实战》⾥提到:
使⽤可⽤特征的均值来填补缺失值;
使⽤特殊值来填补缺失值,如-1;
忽略有缺失值的样本;
使⽤相似样本的均值添补缺失值;
使⽤另外的机器学习算法预测缺失值。
填补:
#使⽤出现次数最多的值填补
train['Embarked'] = train['Embarked'].fillna('S')
train.product_type[train.product_type.isnull()]=train.product_type.dropna().mode().values
这⾥的特殊值是在这个特征下出现最多的⼀个值,特殊值的选取需要根据情况来判断,中位数也是特殊值:
#使⽤中位数填补
train['Fare'] = train['Fare'].fillna(train['Fare'].median())
使⽤平均数填补
train['Age'] = train['Age'].fillna(train['Age'].mean())
train['LotFrontage'].fillna(train['LotFrontage'].mean())
忽略
根据情况可以选择忽略这⼀特征的列和忽略出现缺失的那⼏⾏。
通常后者出现在缺失的⾏数⽐较少的情况下。
#去掉⼀列
train = train.drop(['Cabin'], axis = 1)
#去掉这个特征为空的⾏
#当然后⾯可以加上inplace=True表⽰直接就在内存中替换了不⽤再赋值个train_new,但是本⼈多次删
除掉⼏个⾏,发现有问题时⼜需要重新建⽴已经分析好的train,很浪费时间,个⼈认为还是重新开辟⼀个⽐较好
train_new = train.drop(train[train['Embarked'].isnull()].index)
#返回已经去掉重复⾏的数据集
train.drop_duplicates()
2.3 处理偏离值
查偏离值
将数据可视化(python中的pyplot),观察异常值,引⽤HousePrice中的⼀个例⼦:
#bivariate analysis saleprice/grlivarea
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
可以发现,有四个点在⾮常偏离的位置,先讨论上⾯两个偏移位。
在下⽅⽆数点形成⾮常好的线性关系,那这偏移很⼤的两点是异常值吗?不是,虽然偏离位置很远,但是与下⾯⽆数点形成的线性关系还是拟合的。
再看看右下两个值,显然它们偏离得没有道理,删!
删除偏离值
train.sort_values(by = 'GrLivArea', ascending = False)[:2]
train= train.drop(train[train['Id'] == 1299].index)
train= train.drop(train[train['Id'] == 524].index)
保留偏离值
当然并不是所有的偏离值都需要删除,具体需要在分析之后选择处理⽅式。这⾥将偏离值保留下来并不是原封不动保留,⽽需要做标准化或归⼀化处理,具体的处理⽅式可查看最后⼀节数据转换、标准化、归⼀化。
数据统计
现在我们已经拿到了⼀份⽐较完整的数据,让我们开始对它做⼀个简单的统计。
统计包括数据的偏斜度、峰度、不同特征值的相关系数、协⽅差、均值等。
#统计某⼀列中各个元素值出现的次数
train['MSSubClass'].value_counts()
#
#列出数据的偏斜度
train['MSSubClass'].skew()
#列出数据的峰度
train['MSSubClass'].kurt() 
#计算两个列的相关度
train['LotFrontage'].corr(train['LotArea'])
#观察两个列的值的⼆维图
x = 'GrLivArea';y = 'SalePrice'
data = pd.concat([train[y], train[x]], axis=1)
data.plot.scatter(x=x, y=y, ylim=(0,800000));#这⾥800000为y的最⼤值
#计算所有特征值每两个之间的相关系数,并作图表⽰。
corrmat = ()#得到相关系数
f,ax = plt.subplots(figsize = (12,9))
sns.heatmap(corrmat, vmax = .8, square = True)#热点图
#取出相关性最⼤的前⼗个,做出热点图表⽰
k = 10 #number of variables for heatmap
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()
热点图展⽰:
2.4特征值的合并、连接
在合并连接之前,我们需要了解upby这个分组⽅法,因为很多时候我们是在从⼏个特征值
⾥挖掘⼀些值来当作新的特征值,这样⼦我们这个分组的⽅法就显得尤为重要了,如按照同⼀个⽤户进⾏分组来计算这个⽤户的⾏为次数当作新的特征值等等
分组的常⽤代码块:
#按照⽤户分组---------------------⼀个特征值
#按照⽤户与⽬的地分组---------------两个特征值
#⽤户、起点、⽬的地-----------------三个特征值
#跟MSSubClass进⾏分组,并求分组后的平均值
train[['MSSubClass', 'LotFrontage']].groupby(['MSSubClass'], as_index=False).mean()
#选取特定的属性的某个值然后进⾏分类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。