人工智能类比赛从入门到精通 一

本文介绍了一次预测分析比赛,任务是预测客户购买行为,属于二分类问题。文章详细讲解了二分类的定义、评价指标和常见算法,如逻辑回归。并探讨了线性回归和逻辑回归的优缺点,最后提到了实战中的交叉验证方法。
摘要由CSDN通过智能技术生成

前言

本篇文章是先进行赛题解读,然后介绍相关知识点,最后进行实战演练,此实战代码完全可应用到企业内部使用~

1、赛题解读

本次进行的比赛是一个预测分析比赛,预测客户的购买行为,即银行的客服人员与客户进行至少一次的电话联系,以确认客户是否有意愿购买该银行的产品。

此次比赛的基本类型是分类任务,即预测客户是否购买该银行的产品。当在企业工作中时首先进行判断的也是任务类型,与比赛不同的是,比赛规定的是分类任务,而企业中,是要求自己去设计是哪种类型,并且绝大部分任务,分类和回归类型模型都是可行的。

比赛相关地址:
https://www.kesci.com/home/competition/5c234c6626ba91002bfdfdd3/content/1

2、相关知识点

2.1二分类问题

2.1.1分类回归相关概念

概念:输入变量 X 和输出变量 Y 有不同的类型,可以是连续的,也可以是离 散的。人们根据输入、输出变量的不同类型,对预测任务给与不同的名称:输入 变量和输出变量均为连续变量的预测问题称为回归问题;输出变量为有限个离散 变量的预测问题称为分类问题;输入变量与输出变量均为变量序列的预测问题称 为标注问题。

2.1.2 二分类评价指标

对于模型的结果来说,评价指标是非常重要的,要非常熟悉评价指标的意义,从指标来直观的观察模型的效果。

1)准确率
2)混淆矩阵
3)精准率,召回率,F1_score
4)auc
5)logloss

2.1.3 二分类算法

常见的二分类算法如下,训练时要会根据数据量来确定使用哪种模型,逻辑回归和树模型是比较常用的,可解释性比较好,数据量少时,树模型会存在过拟合的现象,这是要注意的
1)Logistic 回归
2)SVM
3)决策树
4)随机森林
5)Adaboost
6)xgboost
7)lightgbm
8)catboost
9)朴素贝叶斯

2.2 逻辑回归

2.2.1 线性回归

概念:线性回归(Linear Regression)是一种通过属性的线性组合来进行预测 的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预 测值与真实值之间的误差最小化。

h(x) = w1x1 + w2x2 + …+wnxn
线性回归是通过数据在N 维空间找到h(x)来描述这些数据的规律,这是一个叫 做拟合的过程,h(x)叫做拟合线。

优缺点:
1、权重W T 是每个 x 的权重,通过W T 的大小可以看出每个 x 的权重的大小,可以判断因子的重要性
2、有很好的解释性
3、缺点:非线性数据拟合不好

2.2.2 逻辑回归

从上面h(x)公式我们可以发现,h(x)预测值是连续的,所以 这是一个回归模型。那如果我们希望输出的值是离散的,也就是预测值是离散值, 所以线性回归是回归模型。那需要将h(x)进行一次函数转换,变成g(z)。其中
g ( z ) 某些值属于类别 1,另一些 g ( z ) 值属于类别,这样的模型则为二分类模型。 二元逻辑回归就是这样来的。

此时函数 g 一般为:
g(z) = 1 / 1+ e-z

逻辑回归的优缺点

优点:
1)容易理解和实现,可以观测样本的概率分数
2)训练速度快
3)由于经过了 sigmoid 函数的映射,对数据中小噪声的鲁棒性较好
4)不受多重共线性的影响(可通过正则化进行消除)

缺点:
1)容易欠拟合
2)特征空间很大时效果不好
3)由于 sigmoid 函数的特性,接近 0/1 的两侧概率变化较平缓,中间概率敏感, 波动较大;导致很多区间特征变量的变化对目标概率的影响没有区分度,无法确
定临界值。

实战演练

# 导入需要用的package
from sklearn.model_selection import train_test_split
import lightgbm as lgb
import numpy as np
import pandas as pd
# 精准率,召回率
from sklearn.metrics import precision_score,recall_score
# 读取数据
path = './'
train = pd.read_csv(path+'train_set.csv')
test = pd.read_csv(path+'test_set.csv')
# 了解训练集的指标,同时也可以对测试集进行同样的操作
# 数据描述
train.describe()
# 相关性查看
train.corr()
# 统计字段个数
train.job.value_counts()
# 查看训练集信息
print(train.info())

# 将测试集加入到训练集中,利用 y 字段进行区分,这样做的目的是为了特征处理时是使用全部数据进行处理的,而不是只考虑训练集
test['y'] = -1
print(len(test.columns))
data = train.append(test).reset_index(drop=True)
print(data.head())
# 特征处理
# (1)对类别进行编码
# (2)统计特征处理
from tqdm import tqdm_notebook
from sklearn.preprocessing import LabelEncoder
cat_col = [i for i in data.select_dtypes(object).columns if i not in ['ID','y']]
for i in tqdm_notebook(cat_col):
    lbl = LabelEncoder()
    data['count_'+i] = data.groupby([i])[i].transform('count')
    data[i] = lbl.fit_transform(data[i].astype(str))
# 使用的特征
feats = [i for i in data.columns if i not in ['ID','y']]
feats
# 建模
from xgboost import XGBClassifier
model = XGBClassifier(
        learning_rate=0.01,#学习率
        n_estimators=3000,#树的个数,数据量较少的不要将数值设置太大
        max_depth=4,#深度
        objective='binary:logistic',
        seed=27 #随机种子,复现结果要设置
    )
# 训练数据以及预测
train_x =data[data['y']!=-1][feats]
train_y =data[data['y']!=-1]['y']
testx= data[data['y']==-1][feats]
# 划分数据集,在实际工作中一定要做的操作
# train_x, test_x, train_y, test_y = train_test_split(data1, label1, test_size=0.3, random_state=42)
#训练数据
model.fit(train_x,train_y)
#预测模型
test_pre = model.predict_proba(testx)[:,1]
pre = data[data['y'] == -1][['ID']]
pre['pred'] = test_pre
pre.head()

此部分是对以上基本代码进行了交叉验证,是验证模型稳定性的一种方式。

# 五折交叉验证
from sklearn.model_selection import KFold
n_split=10
kfold = KFold(n_splits=10,shuffle=True,random_state=42)
train_x = data[data['y']!=-1][feats]
train_y = data[data['y']!=-1]['y']
res=data[data['y']==-1][['ID']]
test_x= data[data['y']==-1][feats]
res['pred'] = 0

for train_idx,val_idx in kfold.split(train_x):
    model.random_state = model.random_state+1
    train_x1 = train_x.loc[train_idx]
    train_y1 = train_y.loc[train_idx]
    test_x1 = train_x.loc[val_idx]
    test_y1 = train_y.loc[val_idx]
    model.fit(train_x1,train_y1,eval_set=[(train_x1,train_y1),(test_x1,test_y1)],
             eval_metric='auc',early_stopping_rounds=100)
    res['pred'] += model.predict_proba(test_x)[:,1]
    
res['pred'] = res['pred'] / 10

有任何问题请留言,会尽快处理~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值