一、数据挖掘流程
1.数据读取
-读取数据
-统计指标
-数据规模
2.数据探索(特征理解)
-单特征的分析,诸个变量分析对结果y的影响(x,y的相关性)
-多变量分析(x,y之间的相关性)
-统计绘图
3.数据清洗和预处理
-缺失值填充
-标准化、归一化
-特征工程(筛选有价值的特征)
-分析特征之间的相关性
4.建模
-特征数据的准备和标签
-数据集的切分
-集成算法(提升算法)XGBoost、GBDT、light-GBM、神经网络(多种集成)
二、代码实现
1.数据读取
数据集可以去kaggle下载:Titanic - Machine Learning from Disaster | Kaggle。
data = pd.read_csv('./data/train.csv')
pd.set_option('display.max_columns', 20)
print(data.head(4)) 
 

print(data.info())

print(data['Survived'].value_counts()) # 当前列计数

2、数据探索
# 标签比例 获救比例,饼图
f, ax = plt.subplots(1, 2, figsize=(10, 6))
data['Survived'].value_counts().plot.pie(explode=[0, 0.1],  # 偏移量
                                         autopct='%1.1f%%',  # 百分比保留小数位数 
                                         ax=ax[0], shadow=True)
ax[0].set_title('Survived')  # 图一标题
sns.countplot('Survived', saturation=0.75,  # 饱和度
              data=data, ax=ax[1])  # 柱状图
plt.show()
 
 

# 男女获救比例 print(data.groupby(['Sex', 'Survived'])['Survived'].count())

sns.countplot('Sex', hue='Survived', data=data)  # 柱状图
plt.show() 
 

# 船舱等级和获救之间的关系 print(pd.crosstab(data['Pclass'], data['Survived'], margins=True))
 
sns.countplot('Pclass', hue='Survived', data=data)
plt.show() 
 

# 不同性别及船舱等级和获救之间的关系 print(pd.crosstab([data['Sex'], data['Survived']], data['Pclass'], margins=True))

sns.factorplot('Pclass', 'Survived',
               hue='Sex',  # 颜色
               data=data)   # 降维画图
plt.grid()
plt.show() 
 
 
3.数据清洗和预处理
3.1 提取性别身份,并将少数类归为其他
data['initial'] = data['Name'].str.extract('([A-Za-z]+)\.') # 提取性别身份
print(data['initial'].head(5)) 
 

print(pd.crosstab(data['initial'], data['Sex']).T)

将少数的列变为other列。(除Master、Mr、Miss、Mrs外的其他列变为other列)
def transformOther(str):
    if str != 'Master' and str != 'Miss' and str != 'Mr' and str != 'Mrs':
        str = 'other'
    return str 
 
 
 data['re'] = data['initial'].apply(transformOther) print(data['re'].unique())

print(data.groupby('re')['Sex'].count()) 
 

3.2 缺失值填充
3.2.1填补Age缺失值(用各性别下年龄均值去填补Age缺失值)
# 各性别下年龄均值
print(data.groupby('re')['Age'].mean())
print(int(data.groupby('re')['Age'].mean()[0])) 
 

def FillNullAge(age):
    for str in data['re'].values:
        if np.isnan(age):
            age = int(data.groupby('re')['Age'].mean()[str])
    return age
data['Age'] = data['Age'].apply(FillNullAge) 
 
 
 print(data['Age'].isnull().sum())

3.2.2 填充港口数据
上船港口和船舱等级之间的关系。
# 上船港口和船舱等级之间的关系
print(pd.crosstab(data['Embarked'], data['Pclass'], margins=True))
sns.countplot('Embarked',  # 上船的港口
              hue='Pclass', data=data)
plt.show() 
 


上船港口和获救之间的关系。
# 上船港口和获救之间的关系
print(pd.crosstab(data['Embarked'], data['Survived'], margins=True))
sns.countplot('Embarked', hue='Survived', data=data)
plt.show() 
 
 

填补港口数据为s。
data['Embarked'].fillna('s', inplace=True)  # 填补港口数据
print(data['Embarked'].isnull().any()) 
 

不同船舱的核密度估计图
# 不同船舱的核密度估计图 f, ax = plt.subplots(1, 3, figsize=(10, 8)) sns.distplot(data[data['Pclass'] == 1].Fare, ax=ax[0]) sns.distplot(data[data['Pclass'] == 2].Fare, ax=ax[1]) sns.distplot(data[data['Pclass'] == 3].Fare, ax=ax[2]) plt.show()

相关性热图
# 相关性热图
sns.heatmap(data.corr(), annot=True, linewidths=0.2, cmap='summer_r')
fig = plt.gcf()
fig.set_size_inches(8, 6)
plt.savefig('heatmap.jpg') 
 
 
3.3 数据处理
3.3.1 年龄分段(









