数据挖掘入门案例分享

数字化转型网数据专题将关注数据治理、数据质量管理、数据架构、主数据管理、数据仓库、元数据管理、数据备份、数据挖掘、数据分析、数据安全、大数据、数据合规、等数据相关全产业链相关环节。

一、明确目标

首先我们需要明确的是,这是一个预测任务,需要实现的效果是:“给模型输入一位乘客的信息,判断该乘客是否会生还”。由于这是个定好主题的比赛,因此目标相对明确,但是我们在实际业务场景中,通常需要进一步判断我面对的问题是什么,我的模型需要实现什么效果,这涉及到后续建模的时候使用什么模型和算法。

二、数据集构建(数据采集&数据清洗)

同样由于这是一个比赛,我们拿到的基本上是已经相对完整的数据了。打开从网站上下载的文件包,train.csv是训练数据集,即建模的样本,test.csv是测试集数据,即需要通过模型验证预测结果的数据,用excel打开数据长这样:数字化转型网www.szhzxw.cn

数据总共有11个维度,训练集和测试集数据维度相同,分别是:

PassengerId:乘客ID,主键索引

Survived:是否生还,1-生还,0-未生还,是本项目需要建模预测的结果

Pclass:客舱等级,1/2/3等舱

Name:姓名

Sex:性别

Age:年龄

SibSp:兄弟姐妹/妻子等旁系亲属数量数字化转型网www.szhzxw.cn

Parch:父母/小孩这类直系亲属数量

Ticket:票号

Fare:票价

Cabin:客舱编号

Embarked:登船港口编号

在现实情况下,该选用什么样的数据指标,不同的数据维度该进行怎么样的处理,一般都需要数据的同学自己构建。针对这个项目示例拿到的数据,我们其实也可以增加自己设计出来的新的数据指标。拿到上面的数据集之后,我们还不能直接用,一般需要经过两个步骤才能正式把数据“喂”给模型。

1.数据预处理

我们先用pandas加载csv文件:

# 训练集

train_data = pd.read_csv(“./train.csv”)数字化转型网www.szhzxw.cn

# 测试集

test_data = pd.read_csv(“./test.csv”)

从数据截图可以看到文档中数据其实不是那么“干净”,首先很多数据都不是“数”,可能是一个字符串或者一串编码,这样的数据是无法直接进行建模计算的。另一个问题是很多数据维度质量并不高,存在大量的缺失值。因此我们首先要保证喂给模型的数据是“干净”的,即每个维度都需要是数学上能够直接运算的编码。在这里我们介绍一种比较简单直观的”one-hot”编码方式。这种方式的基本思想是,把不能直接运算的特征转化为离散编码的模式,把每种取值都看作一种状态,用0/1的形式来表示每个样本是否激活的该状态。

比如针对性别这个特征,原本只有一列“male/female”的取值,那么我们可以把他转化为两列,“是否male”和”是否female”,那当一个乘客的性别为“male”时,他在数据编码当中的取值就变成了“是否male-1”,“是否female-0”,这样便保证了数据可以被建模计算。在python当中,我们可以使用pandas的函数来快速实现:

pd.get_dummies(train_data[features])数字化转型网www.szhzxw.cn

构建完成的数据集形式如下图所示:

除特征编码以外,我们还需要有选择性地对重要的数据维度缺失值进行填补,各维度缺失情况如下:

这里其实有很多技巧,简单一点的可以用默认值进行填补,比如均值填补,中位数填补等等。或者可以用一些先验的知识进行辅助判断,比如对于年龄的缺失值,我们可以根据姓名当中的称谓,Miss,Mr,Master来判断乘客的年龄范围,再用中位数进行填补。这些技巧我们先不过多赘述,我们这里先采较为简单的方式对这些维度进行处理:年龄-均值,客舱编号-默认值,港口编号-众数。

#顺便复习一下其他的预处理技巧

#缺失值处理可以使用fillna方法填充缺失值。例如,对于年龄这一列,可以使用中位数填充缺失值

df[‘Age’].fillna(df[‘Age’].median(), inplace=True)

#归一化:可以使用sklearn.preprocessing模块中的MinMaxScaler类进行归一化

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

df[‘Fare’] = scaler.fit_transform(df[[‘Fare’]])数字化转型网www.szhzxw.cn

#标准化:可以使用sklearn.preprocessing模块中的StandardScaler类进行标准化

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

df[‘Age’] = scaler.fit_transform(df[[‘Age’]])

#分箱处理:可以使用pandas.cut方法对连续型变量进行分箱处理

df[‘Age’] = pd.cut(df[‘Age’], 5, labels=False)

#特征选择:可以使用相关系数、卡方检验、互信息等方法进行特征选择

corr = df.corr()[‘Survived’].abs().sort_values(ascending=False)

top_features = corr.index[1:4]

#数据变换:可以使用对数变换、平方根变换等方法对数据进行变换

df[‘Fare’] = np.log1p(df[‘Fare’])数字化转型网www.szhzxw.cn

#异常值处理:可以使用箱线图、Z-score等方法检测异常值,并将其删除或替换

Q1 = df[‘Fare’].quantile(0.25)

Q3 = df[‘Fare’].quantile(0.75)

IQR = Q3 – Q1

upper_bound = Q3 + 1.5 * IQR

df.loc[df[‘Fare’] > upper_bound, ‘Fare’] = upper_bound

#文本数据处理:可以使用词袋模型、TF-IDF等方法对文本数据进行处理

df[‘Title’] = df[‘Name’].str.extract(‘ ([A-Za-z]+)\.’, expand=False)

df = pd.concat([df, pd.get_dummies(df[‘Title’], prefix=’Title’)], axis=1)

df.drop(‘Title’, axis=1, inplace=True)数字化转型网www.szhzxw.cn

#时间数据处理:可以提取出时间数据中的年、月、日、星期等信息

df[‘Year’] = pd.DatetimeIndex(df[‘Date’]).year

那么处理完编码和缺失值之后,我们是不是可以直接进行建模了呢?反正我只要能把所有变量转换成编码,那我直接数据维度越多越好,扔给机器去学习不就好了?

这里就涉及到的一个新的概念叫做过拟合,也就是指的是模型在训练集上表现的很好,但是对未知样本的预测表现一般,如果你选取的特征维度过多,且与预测目标的相关性不大,那么可能就出现这种情况。举个例子,假设在刚刚构建数据集的时候我选择了“姓名”这个维度作为特征,那编码过后的数据集就变成了“是否张三”,“是否李四”,那么模型接收到的数据信息可能就变成了“只有姓名时张三和李四的人生还”,那么此时来了一个用户姓名叫“赵四”,完全不在训练集的名单里面,那姓名这个特征在模型当中就变成了噪声,有还不如没有。

且另一方面,数据维度的增加意味着模型的大小和训练代价的增大,如果数据特征太过稀疏,则数据集可能会长成这个样子:数字化转型网www.szhzxw.cn

这样的数据会导致模型训练和预测的性能相当低,实际应用场景当中我们肯定是尽可能精简。所以,在把数据喂给模型之前,我们还需要做一件事,那就是特征筛选。

2.特征筛选

1、如何构建特征其实有很多技巧,这里我们先用大家比较熟悉的分析方法来试一试,我们把这个数据集扔到excel里面做透视,对可能相关的数据特征进行对比分析,观察不同维度下的乘客存活率,以下是一份简单的对各个单一特征维度下乘客的生还率分析:

从数据中可以看出,女性乘客的生还率对比男性要高,青年和中年的生还率略高于老人和儿童,同时客舱等级越高级、票价越贵乘客的生还率也越高,有1~2个亲属的乘客生还概率最高,其次是单身汉,亲属越多的乘客生还概率越低等等。

进一步分析我们可能还会发现,客舱编号跟客舱等级呈正相关,只有一等舱/少量二等舱才有编号,B/D/E几个客舱的乘客生还率更高,直系亲属的数量通常和年龄呈正相关,旁系亲属越多的乘客可能是一家人集体出行等信息。

除此之外,除了群体特征以外,我们还需要考虑数据的方差等因素。在实际分析过程当中,一个一个去做变量分析也是比较费时间的,一般我们可以采取一些统计学方法来检验各个数据维度之间的相关性,例如卡方检验,皮尔逊相关系数等等。我们可以把每个变量之间的相关系数绘制成矩阵,这样我们就可以知道,哪些变量跟预测目标相关性更强,哪些变量性质重复容易引起过拟合,那么我们就可以考虑降维或者重新构造新的特征。在代码实现当中,我们这里使用sklearn的特征选择工具来计算相关性,我以卡方值的计算为例子:数字化转型网www.szhzxw.cn

X_new = SelectKBest(chi2, k=50).fit(X, y)

得到的结果如下:

这里便可以得到one-hot编码之后的每一个特征与存活率的相关性,卡方值越大,相关性越高,我们便可以依此来选择我们要使用的重要特征。我们演示的时候先把尽可能多的维度作为特征放进去试一下:

features = [“Age”,”Pclass”,”Sex”, “SibSp”, “Parch”,”Fare”,”Embarked”,”Cabin”]

三、模型训练&模型评估

现在数据原材料已经准备完毕,准备构建能够实现预测目标的模型。在此之前,我们再回顾一下数据挖掘模型的的核心目标,刚刚我们在分析特征的时候,其实心里已经大致有一个大概的结论了,如果要我们说出什么样的乘客生还率更高,那么我们可能会回答:女性,有钱人,乘头等舱等特征。就好比在分析某个APP的时候,我们会描述“该APP的主要受众是16~24岁青年人,主要分布在三线以下城市”,那么模型的主要作用就是,可以预测一个联合概率:当一个39岁的中年女性乘2等舱,在C港上船,带着老公和孩子,她生还的概率有多大,这个是数据分析解决不了的问题。

在本示例中,我们先用比较火热的随机森林模型进行尝试,模型训练的底层原理在这里先不赘述,我们用sklearn的工具包快速实现:

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1,verbose=1)#初始化

model.fit(X_train, y_train)#训练

y_pred = model.predict(X_val)#预测

最终预测得到的结果如下,获得的是对应样本的0/1标签:

然后我们只要把数据整理成需要提交的格式,就可以去kaggle上参加比赛啦!真的这么丝滑吗?总觉的少了点什么东西,对,那就是我们根本不知道模型效果到底好不好!数字化转型网www.szhzxw.cn

我们拿到的测试集是根本没有标签的,这样模型预测的结果也不知道对不对,也不知道要怎么优化。在这里我们会一般采取类似A/B实验的方法,将训练数据集分为训练集和验证集,以模型在验证集上的预测效果作为依据进行调优。我们这里采取80%的训练集,20%的验证集进行划分,实现方式如下:

X_train, X_val, y_train, y_val = train_test_split(

X, y, test_size=0.2, random_state=1)

评价模型的好坏指标有很多,在这里我们介绍4个常用指标:准确率(Accuracy),精确率(Precision),召回率(Recall),F1值(F1-score)。

我们首先定义几种预测结果:

TP:True Positive。预测为1,实际为1,预测正确。

FP:False Positive。预测为1,实际为0,预测错误。

FN:False Negative。预测为0,实际为1,预测错误。

TN:True Negative。预测为0,实际为0,预测正确。

1、准确率 = (TP+TN) / (TP+FP+FN+TN),即模型预测正确的样本数/总样本数,这个指标相对来说比较好理解,但是在样本不均衡的情况下不适用。假设一个10万的数据集当中有99999个正样本,负样本只有一个,那么我的模型只要把所有样本都预测为正,这样准确率就能够达到99.999%的好成绩,但是这样的模型并没有什么卵用。数字化转型网www.szhzxw.cn

2、精确率 = TP/(TP+FP),即所有我预测为正的样本当中,有多少预测对了,又叫查准率。

3、召回率 = TP/(TP+FN),即样本当中所有的正样本,有多少被识别出来了,又叫查全率。

4、F1值 = (2*精确率*召回率)/(精确率+召回率),是一个综合衡量精确率和召回率的指标。

在不同的业务场景中,模型关注的指标可能也都不太一样,但整体来说我们需要选取一个主要的核心指标,不断地重复训练-调优的过程。以我们示例当中的数据集为例,上一段落我们把觉得相关的数据维度都放进去训练了,对预测结果分别计算4个指标看看:

# 模型评估

print(“accuracy:%f” % accuracy_score(y_val, y_pred))

print(“precision:%f” % precision_score(y_val,y_pred))

print(“recall:%f” % recall_score(y_val, y_pred))

print(“f1_score:%f” % f1_score(y_val, y_pred))

结果如下:

模型准确率只有77.6%,有点不尽人意,主要问题是召回率比较低,此时就需要对模型进行调优。我们尝试对数据维度进行优化,刚刚分析的时候发现仓位编号其实跟票价,客舱等级都是正相关的,这个特征的加入有可能会导致模型过拟合,我们把这个特征去掉试试看:数字化转型网www.szhzxw.cn

模型效果显著提升!所以说数据集的构建在整个数据挖掘过程当中扮演了非常重要的角色,那么除了优化数据特征本身,我们还可以对模型参数进行调优,由于数据集本身较少,随机森林的深度不需要过深,那么我们试着把树的深度调整为3:模型效果再度提升!后续的优化手段也是围绕着特征和模型进行优化的,尤其是特征工程,我们可以利用业务知识构造出更多关键特征来提高模型准确度,至于模型本身,作为数据人员除了参数以外很难有算法上的改进。

四、尾声

到这里整个数据挖掘的流程就已经大致走了一遍,实际的业务场景中我们要做的肯定比这个复杂得多,首先数据量级肯定会非常大,需要结合做对应的ETL,同时我们也需要考虑线上应用部署。但是整体思想是不变的:数据清洗—特征工程—模型训练—评估调优—线上应用。后续我会针对各个环节当中的实战技巧,进行一些分享,抛砖引玉,期望能够给想要入门数据挖掘的同学一些帮助。

声明:本文来自网络,版权归作者所有。文章内容仅代表作者独立观点,不代表数字化转型网立场,转载目的在于传递更多信息。如有侵权,请联系我们。数字化转型网www.szhzxw.cn

数字化转型网数据专题包含哪些内容

数字化转型网数据专题将关注数据治理、数据质量管理、数据架构、主数据管理、数据仓库、元数据管理、数据备份、数据挖掘、数据分析、数据安全、大数据、数据合规、等数据相关全产业链相关环节。

数字化转型网数据专题包含: 数字化转型网(www.szhzxw.cn)

1、数据相关外脑支持:100+数据相关专家、100+数据实践者、1000+相关资料

2、数据研习社:与全球数据相关专家、实践者共同探讨相关问题,推动产业发展!

3、国际认证培训:目前已引进DAMA国际认证CDMP,其他国内外认证也在逐步引进中

4、典型案例参考:与数字化转型网数据要素X研习社社员一起学习典型案例,共探企业数据落地应用

本文由数字化转型网(www.szhzxw.cn)转载而成,来源于 渭河数分星球;编辑/翻译:数字化转型网Jack。

免责声明: 本网站(http://www.szhzxw.cn/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。 本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等) 版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。https://www.szhzxw.cn/64601.html
联系我们

联系我们

17717556551

邮箱: editor@cxounion.org

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部