kaggle-数据处理的部分做法

在Kaggle比赛中最终要的步骤就是进行数据的分析,数据的清洗,以及特征的提取。因此我总结了最近常会用到的数据处理的方法,以便将来复习和使用。

一、读取和存储csv文件

从.csv文件中读取文件内容;将DataFrame对象存放到.csv文件中

#读取文件内容
train = pd.read_csv('train.csv',index_col=0)#读取内容时,如果每行前面有索引值,舍去

#将DataFrame类型的对象(最终提交的结果形式),转换为.csv文件
result = pd.DataFrame({'PassengerId':data_test['PassengerId'].values,'Survived':prediction.astype(np.int32)})
result.to_csv("predict_result.csv",index=False) #每行的内容前不加索引

二、数据分析

1、对于各个特征,可以通过画条形图来显示每个特征与分类标签之间的关系,例如在Titanic比赛中,观察每个特征与获救情况之间的关系

#plt.subplot2grid((m,n),(a,b)):划分为m*n个子图,该子图的位置从位置(a,b)开始画

#绘制单个特征下特征值的分布情况
plt.subplot2grid((2,3),(0,1))   #第二个子图从第0行第1列开始画
#df.feature返回该特征下的所有值,value_counts()统计每个分类下的人数,'bar'画柱状图
data_train.Pclass.value_counts().plot(kind='bar')   
plt.ylabel(u"人数")
plt.title(u"乘客的等级分布")

#查看具体特征 与 最终分类之间的关系
#第三个子图:根据年龄看获救人数的分布情况,画散点图
plt.subplot2grid((2,3),(0,2))
#画散点图,横坐标为获救获救,纵坐标为年龄值
plt.scatter(data_train.Survived,data_train.Age) 
plt.ylabel(u"年龄")   #y轴标签
plt.grid(b=True,which='major',axis='y')  #绘制刻度线的网格线,
# Parameters:which(默认为major); axis(取值为‘both’,'x','y')表示绘制哪个方向的网格线
plt.title(u"按照年龄看获救的分布情况(1表示获救)")

2、进行特征和最终分类标签的关联统计

#定义图表对象
fig = plt.figure()
fig.set(alpha=0.2)
#按照等级 分别求获救人数和未获救的人数 
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()#各个等级未获救的人 数
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()#各个等级获救的人数
#转换为DataFrame对象,使用字典作为参数。key值为DataFrame对象的特征值
df = pd.DataFrame({'获救':Survived_1,'未获救':Survived_0})
#绘制条形图,堆叠的条形图
df.plot(kind='bar',stacked=True)
plt.title(u'各个乘客等级的获救情况')
plt.xlabel(u'乘客的等级')
plt.ylabel(u'人数')
plt.show()

3、筛选符合条件的样本,作图分析

#例如:统计女性(Sex)在高等舱(Pclass)的获救情况(Survived)
fig = plt.figure()
fig.set(alpha=0.65)
plt.title('查看舱等级和性别的获救情况')

#使用add_subplot()方法添加子图,返回的是当前绘画图像
ax1 = fig.add_subplot(141)#子图的个数1*4,当前绘制的是第一个子图
#按照条件筛选
data_train.Survived[data_train.Sex=='female'][data_train.Pclass != 3].value_counts().plot(kind='bar',label='female highclass',color='#FA2479')

#设置x轴上的刻度值,旋转角度为0
ax1.set_xticklabels(['获救','未获救'],rotation=0)
#设置整个图表的标签值
ax1.legend(['女性/高级舱'],loc='best')
plt.show()

4、查看某个特征对最终的分类结果有无影响

#使用groupby()进行分组
data_train.groupby(['SibSp','Survived']) #先按照SibSp分组,再对每一个分组下按照Survived进行分类
#使用count函数统计分类,最终得到结果是对应的每一行的各个属性值都是统计得到的人数,所以只取其中一列显示就可以了
df = pd.DataFrame(g.count()['PassengerId'])
print(df)

5、查看各个属性之间的相关程度,使用热度图

corrmat = train.corr()    #得到特征之间的相关系数矩阵
#列出与特定的特征item_cnt_day相关系数由大到小进行排列
#取与item_cnt_day相关系数最大的5个特征值,由大到小排列的矩阵
cols = corrmat.nlargest(5,'item_cnt_day')['item_cnt_day'].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()

三、进行数据处理

1、缺失值

(1)如果缺失的值很多占样本总数比例很高,则直接舍弃

#读取训练集和测试集数据
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

#先将训练集和测试集合并,便于处理
tables = [train,test]
print(tables)
print("Delete features with high number of missing values...")
#统计每一个特征的缺失数量,df.isnull()最终返回每个特征下数值的缺失情况
total_missing = train.isnull().sum()
#to_delete存储缺失量超过三分之一的属性
to_delete = total_missing[total_missing > (train.shape[0]/3.)]
print(to_delete)

for table in tables:
    #删除缺失值 超过总数据量三分之一的 属性,使用drop函数删除该列
    table.drop(list(to_delete.index),axis=1,inplace=True)

(2)缺失的样本个数适中,且该属性非连续值特征属性,则将NaN作为一个新类别,加到类别特征中

(3)缺失的样本个数适中,且属性值为连续性特征值,给定特定范围,把它离散化,将NaN作为一个type加到属性类目中

(4)缺失的个数不多时,可以根据已有值,拟合数据补充 

def set_missing_ages(df):
    '''
    函数说明:使用RandomForestClassifier填充缺失的年龄的属性
    函数实现:先将所有数值型的属性提取出来,,根据目标属性值划分为两部分数据集进行拟合,再用来预测结果
    Parameters:
        df - DataFrame对象
    returns:
        data_train - 补全后的数据集
        rfr - 随机森林拟合后的模型
    '''
    # 提取所有数值类型的属性 数据
    age_df = df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]
    print(age_df)
    # 将乘客分为已知年龄和未知年龄两部分
    known_age = age_df[age_df.Age.notnull()].values  # dataFrame.属性.notnull()将Age属性值值不为空的数据提取出来
    unknown_age = age_df[age_df.Age.isnull()].values

    # y即目标年龄。所有行的第一列,对应的是年龄值
    y = known_age[:, 0]
    # x即特征的属性值,除了年龄外所有的特征值提取出来
    x = known_age[:, 1:]

    # 将数据拟合到RandomForestRegressor中
    # 随机森林的主要参数:max_features:允许单个决策树使用特征的最大数量;
    # n_estimators:在利用最大投票数或平均值来预测前,想要建立的子树数量,较多的子树性能更好,但是速度会变慢
    rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
    # 使用随机森林拟合数据,返回模型
    rfr.fit(x, y)
    # 用得到的模型进行未知年龄结果的预测
    predictedAges = rfr.predict(unknown_age[:, 1::])  # 取下标为1的值,即取所有样本的未知年龄值
    # 用得到的预测结果取填充之前缺失值
    df.loc[(data_train.Age.isnull()), 'Age'] = predictedAges  # 取Age属性不为空的所有值,补齐Age属性值
    # 返回补全后的数据表,以及拟合的模型
    return data_train, rfr

2、分别筛选数值型和类目型的特征,并将类目型特征转换为one-hot编码

#筛选数值类型的特征
numerical_features = tran.select_dtypes(include=["float","int","bool"]).columns.values
print(numerical_features)

#筛选类目型的特征
categorical_features = train.select_dtypes(include=["object"]).columns.values
print(categorical_features)
#将类目型的特征使用get_dummies()转换成one-hot编码
dummies_Cabin = pd.get_dummies(data_train['Cabin'],prefix='Cabin')
#将编码后的特征列横向拼接到原数据集上
df = pd.concat([data_train,dummies_Cabin],axis=1)
#删除掉原来的列
df.drop(['Cabin'],axis=1,inplace=True)
return df

 

3、对于特征值较大的特征,为了保证同等影响最终的分类结果,需要进行标准化

    #将Age和Fare的值标准化归约到[-1,1]之间
    #定义标准化的对象
    scaler = preprocessing.StandardScaler()
    #拟合和转换训练的数据
    df['Age_scaled'] = scaler.fit_transform(df['Age'].values.reshape(-1,1))
    #拟合和转换训练的数据
    df['Fare_scaled'] = scaler.fit_transform(df['Fare'].values.reshape(-1,1))

4、删除异常数据点

通过画散点图或者查看数据data.describe(),检查数据中的异常点并删除

train = train.drop(train[(train['ArLivArea']>4000)].index) #删除ArLivArea>4000的样本数据

四、Series类型和DataFrame类型说明

#Series相当于数组numpy.array,如果不为其指定索引值,默认为0,1,2...
s1 = pd.Series([1,2,3,4])
print(s1)
s2 = pd.Series([3,2,4,5],index=['a','b','c','d'])
print(s2)


print(s2.values)#返回Series序列值
print(s2.index)


#DataFrame是一个表格型的数据结构,DataFrame将Series使用的场景从一维拓展到多维,
# 既有行索引也有列索引
#1、创建dataFrame的方式:(列表、字典、Series、Numpy ndarrays、DataFrame类型)
#2、dataFrame的参数:dataframe[data,index,columns,dtypes,copy]
#data:各种形式的数据;index:行标签;columns:指定列标签,都可以使用列表;dtype:指定数值型数据的类型;
data = [['Alex',10],['Bob',12],['Claeke',13]]
df = pd.DataFrame(data,columns=['name','age'],dtype=float)
print(df)



#使用数组ndarrays来创建dataframe
data = {'Name':['Tom','Jack','lili'],'age':[28,32,15]}
df = pd.DataFrame(data,index=['1','2','3'])#指定索引值
print(df)



#使用字典创建dataframe,字典的键为dataframe的列名,如果有的值为空,则显示NaN
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df = pd.DataFrame(data,index=['first','second'])#定义行索引,a的first值是1,second值是5
print(df)
#也可以同时使用行索引和列索引创建
df = pd.DataFrame(data,index=['first','second'],columns=['a','b','c'])
print(df)



#使用序列值创建
data = {
    "one":pd.Series(["1","2","3"],index=["a","b","c"],dtype=float)
    "two":pd.Series(["1","2","3","4"],index=["a","b","c","d"])
}
df = pd.DataFrame(data)
print(df)



#使用numpy创建
pd.DataFrame(np.random.randint(60,100,size=(3,4)),index=["a","b","c"])


#DataFrame属性
'''df.values:取出所有值
   df.index:行索引
   df.columns:列索引
   df.shape:表格的维度
#dataframe的切片
res.iloc[1,1:3]#取第二行,b-c列的数据
res.loc["A":"C","B":"C"]#取A-C行,B-C列的数据


#组合两个dataframe对象,合并列
1、join()方法
data1.join(data2)
2、使用assign()方法添加一列
data1.assign('列名称'=range(5))

#添加行
1、行合并两个对象
pd.concat([data1,data2],ignore_index=True,sort=False)
2、使用append方法
data1.append(data2,sort=False)


#列删除
1、删除列,无返回值,直接改变原对象
del(df['one'])
2、pop方法,只删除列,有返回值,不修改原对象


#drop()方法最常用,默认删除行,可以传入行索引名删除指定的行
#删除列的方法相同,但是需要设置axis=1


df.iloc[1:2,3:4]#使用索引值进行定位,取1-2行,3-4列数据
df.loc['name1':'name3','age1':'age3']#可以使用index和索引名进行定位


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值