下面介绍的是用pands读取泰坦尼克遇难船员的数据,然后挑选特征,补全缺失值,特征转换。
1.pands读取数据
titanic=pd.read_csv('./titanic.txt')
其数据形式如下:
|row_num |pclass|survived|name|age|embarked|home.dest|room|ticket|boat|sex|
| -------- | :----: |
|3|1st|0|Allison|30.|Southampton|Montreal|C26||(135)|male|
使用Pandas读入的数据都有pandas独有的dataframe格式,使用info()可查看数据的统计特性
print titanic.info()
>>
>>
RangeIndex: 1313 entries, 0 to 1312 #数据集一共有1313个样本0-1312
Data columns (total 11 columns): #一共有11列
row.names 1313 non-null int64 #有1313个,类型为整型
pclass 1313 non-null object #有1313个,类型对象型,如字符串
survived 1313 non-null int64 #有1313个,类型为整型
name 1313 non-null object #有1313个,类型为对象
age 633 non-null float64 #有633个(即有680个缺失值)
embarked 821 non-null object # 以下同理,不表
home.dest 754 non-null object
room 77 non-null object
ticket 69 non-null object
boat 347 non-null object
sex 1313 non-null object
dtypes: float64(1), int64(2), object(8)
2.挑选特征
我们知道,在原始数据集中,并不是所有的特征对于训练都有用;所以我们就要根据相关背景来进行筛选。此处我们选取sex,age,pclass这三个维度的特征用于训练。
X=titanic[['pclass','age','sex']]
y=titanic['survived']
print X
>>
>>
pclass age sex
0 1st 29.0000 female
1 1st 2.0000 female
2 1st 30.0000 male
3 1st 25.0000 female
4 1st 0.9167 male
5 1st 47.0000 male
6 1st 63.0000 female
7 1st 39.0000 male
8 1st 58.0000 female
9 1st 71.0000 male
10 1st 47.0000 male
11 1st 19.0000 female
... ... ... ...
print X.info()
>>
>>
[1313 rows x 3 columns]
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 3 columns):
pclass 1313 non-null object
age 633 non-null float64
sex 1313 non-null object
dtypes: float64(1), object(2)
memory usage: 30.8+ KB
此时我们可以看到,X中就只有三个维度了;但从X.info()中我们可以看出:
①维度age中仍然有缺失值,需要补全;
②维度pclass和sex维度均为对象值,要进行特征转换;
3.缺失值补全
首先我们需要补充age里的数据,通常使用平均数或者中位数都是对模型偏离造成最小影响的策略。
X['age'].fillna(X['age'].mean(),inplace=True)
print X.info()
>>
>>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 3 columns):
pclass 1313 non-null object
age 1313 non-null float64
sex 1313 non-null object
dtypes: float64(1), object(2)
memory usage: 30.8+ KB
可以看到,此时已经不存在缺失值了。
4.特征转换
先解释一下特征转换,我们知道对象类型的数据是无法进行计算的,所有我们就需要将其转换成其他形式;最直接的就是转换成0,1值,比如性别这个维度就可以用0,1来代替。但是如果有三种类型呢?比如某个维度有great,good,bad有三种取值,那么该如何转换呢?这儿用到的方法就是将这一个维度展开成三个维度,即great,good,bad分别构成一个维度,每个维度都用0,1取值来处理。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)#在进行特征转换之前,我们先对数据集进行切分
vec=DictVectorizer(sparse=False) #sparse=False意思是不用稀疏矩阵表示
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
X_test=vec.transform(X_test.to_dict(orient='record'))
print vec.feature_names_ #查看转换之后的特征维度
print X_train # 转换后的训练集
>>
>>
['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']
[[ 31.19418104 0. 0. 1. 0. 1. ]
[ 31.19418104 1. 0. 0. 1. 0. ]
[ 31.19418104 0. 0. 1. 0. 1. ]
...,
[ 12. 0. 1. 0. 1. 0. ]
[ 18. 0. 1. 0. 0. 1. ]
[ 31.19418104 0. 0. 1. 1. 0. ]]
此时我们就等到了处理好的完整的数据集,就可以将其用于训练了。
源码
参考:
更多内容欢迎扫码关注公众号月来客栈!