天池热身赛——心跳信号模型融合

代码来源于Datawhale开源社区。

关于模型融合

模型融合是比赛后期一个重要的环节,大体来说有如下的类型方式。

一、简单加权融合:

对于回归问题,可以使用算术平均融合,几何平均融合;
对于分类问题,可以使用投票的方法;

二、构建多层模型

即通过拟合多个模型,再分别预测出结果,再将结果做简单的算术融合。常见的方法有Stacking融合,具体过程可以参考这篇blog,讲得很清楚!

三、boosting/bagging

即通过集成学习的方法,提升准确率。

代码实践

其实模型融合的原理并不难,因此可以直接上代码和数据进行理解。

预处理

导入所需要的库

import pandas as pd
import numpy as np
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns

warnings.filterwarnings('ignore')
%matplotlib inline

import itertools
import matplotlib.gridspec as gridspec
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB 
from sklearn.ensemble import RandomForestClassifier,RandomForestRegressor
# from mlxtend.classifier import StackingClassifier
from sklearn.model_selection import cross_val_score, train_test_split
# from mlxtend.plotting import plot_learning_curves
# from mlxtend.plotting import plot_decision_regions

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.neural_network import MLPClassifier,MLPRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error

定义降内存的函数

def reduce_mem_usage(df):
    start_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category')

    end_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df

导入数据与预处理

train = pd.read_csv('D:/data/train.csv')
test=pd.read_csv('D:/data/testA.csv')

# 简单预处理
train_list = []
for items in train.values:
    train_list.append([items[0]] + [float(i) for i in items[1].split(',')] + [items[2]])
    
test_list = []
for items in test.values:
    test_list.append([items[0]] + [float(i) for i in items[1].split(',')])

train = pd.DataFrame(np.array(train_list))
test = pd.DataFrame(np.array(test_list))

# id列不算入特征
features = ['s_'+str(i) for i in range(len(train_list[0])-2)] 
train.columns = ['id'] + features + ['label']
test.columns = ['id'] + features

train = reduce_mem_usage(train)
test = reduce_mem_usage(test)

划分数据集

# 根据8:2划分训练集和校验集
X_train = train.drop(['id','label'], axis=1)
y_train = train['label']

# 测试集
X_test = test.drop(['id'], axis=1)

# 第一次运行可以先用一个subdata,这样速度会快些
X_train = X_train.iloc[:50000,:20]
y_train = y_train.iloc[:50000]
X_test = X_test.iloc[:,:20]

# 划分训练集和测试集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2)

定义训练函数

提前建立所需的模型,这里分别建立了随机森林、LightGBM和神经网络模型。

# 单模函数
def build_model_rf(X_train,y_train):
    model = RandomForestRegressor(n_estimators = 100)
    model.fit(X_train, y_train)
    return model

def build_model_lgb(X_train,y_train):
    model = lgb.LGBMRegressor(num_leaves=63,learning_rate = 0.1,n_estimators = 100)
    model.fit(X_train, y_train)
    return model

def build_model_nn(X_train,y_train):
    model = MLPRegressor(alpha=1e-05, hidden_layer_sizes=(5, 2), random_state=1,solver='lbfgs')
    model.fit(X_train, y_train)
    return model

加权融合

首先我们进行加权融合,大致思路如下,对每个模型都进行拟合,再进行预测,预测的形式为概率。随后三个模型的概率进行加权计算,得到的最终结果为最终的结果。

拟合与预测

print('predict rf...')
model_rf = build_model_rf(X_train,y_train)
val_rf = model_rf.predict(X_val)
subA_rf = model_rf.predict(X_test)

print('predict lgb...')
model_lgb = build_model_lgb(X_train,y_train)
val_lgb = model_lgb.predict(X_val)
subA_lgb = model_rf.predict(X_test)

print('predict NN...')
model_nn = build_model_nn(X_train,y_train)
val_nn = model_nn.predict(X_val)
subA_nn = model_rf.predict(X_test)

定义加权函数

在参数缺省的情况下,默认都为1/3。

def Weighted_method(test_pre1,test_pre2,test_pre3,w=[1/3,1/3,1/3]):
    Weighted_result = w[0]*pd.Series(test_pre1)+w[1]*pd.Series(test_pre2)+w[2]*pd.Series(test_pre3)
    return Weighted_result

进行加权计算

这里自定义权重进行加权计算,加即可得到最终结果进行提交。

w = [0.2, 0.6, 0.2]
subA = Weighted_method(subA_rf,subA_lgb,subA_nn,w)

stacking

stacking的思路有部分是与加权融合差不多,区别在于stacking的第二层分层的。
对于第一层,一样还可以有多个模型。因此第一层我们选择与加权融合的模型相同,即随机森林、LightGBM和神经网络模型,接着分别进行拟合与预测,但对于预测的结果不再是测试集,也不进行进行加权,而是分别预测训练集和测试集,得到两个不同的数据框,一个数据框有三个不同列,每一个列代表一个模型预测出来的结果。
接着第二层区别比较大,这里的训练集与测试集不再是原始数据。而是第一层最后得到的两个数据框。即三个模型对原始训练集预测出来的原始训练集结果数据框和对测试集预测出来的原始测试集结果数据框。
紧接着,对于第二层的模型我们搭建随机森林模型,对新得到的训练集进行训练(这里标签至始至终没有进行处理),训练出的模型对测试集进行预测。

第一层

train_rf_pred = model_rf.predict(X_train)
train_lgb_pred = model_lgb.predict(X_train)
train_nn_pred = model_nn.predict(X_train)
#第二层所需的训练集
stacking_X_train = pd.DataFrame()
stacking_X_train['Method_1'] = train_rf_pred
stacking_X_train['Method_2'] = train_lgb_pred
stacking_X_train['Method_3'] = train_nn_pred
#第二层所需的测试集
stacking_X_test = pd.DataFrame()
stacking_X_test['Method_1'] = subA_rf
stacking_X_test['Method_2'] = subA_lgb
stacking_X_test['Method_3'] = subA_nn

第二层

# 第二层是用random forest
model_lr_stacking = build_model_rf(stacking_X_train,y_train)

## 训练集
train_pre_Stacking = model_lr_stacking.predict(stacking_X_train)
print('MAE of stacking:',mean_absolute_error(y_train,train_pre_Stacking))

## 验证集
val_pre_Stacking = model_lr_stacking.predict(stacking_X_val)
print('MAE of stacking:',mean_absolute_error(y_val,val_pre_Stacking))

## 预测集
print('Predict stacking...')
subA_Stacking = model_lr_stacking.predict(stacking_X_test)

最后的model_lr_stacking即为最终预测结果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天池心跳信号分类预测是基于卷积神经网络(Convolutional Neural Network,CNN)的一个任务。CNN是一种专门用于处理具有网格状拓扑结构数据的深度学习算法,常用于图像识别和处理方面。 对于天池心跳信号分类预测任务,首先需要准备好心跳信号的数据集,包括心电信号的采集数据以及对应的标签。然后,可以使用CNN模型对这些心跳信号进行分类预测。 CNN模型的主要思想是通过多层卷积和池化操作来提取信号的特征,并利用这些特征进行分类预测。具体而言,CNN模型由输入层、卷积层、池化层、全连接层和输出层组成。首先,输入层接收心跳信号数据,然后通过卷积层提取信号的局部特征,并通过池化层对特征进行降维。接下来,通过全连接层将数据进行分类,最后在输出层得到分类预测结果。 在训练CNN模型时,通常采用反向传播算法来更新模型的参数,通过最小化损失函数来优化模型的分类效果。训练过程中,可以采用一部分数据用于训练,另一部分数据用于验证模型的泛化能力。 总之,天池心跳信号分类预测使用CNN模型进行信号特征提取和分类预测,通过卷积、池化和全连接等操作,充分利用心跳信号的局部特征进行分类判断,从而实现对心跳信号的准确分类预测。这有助于医学领域对心脏疾病等相关问题的研究和诊断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值