⽤Python实现机器学习的介绍
机器学习之路虽漫漫⽆垠,但莘莘学⼦依然纷纷投⼊到机器学习的洪流中。如何更有效地开始机器学习呢?所谓「⼋仙过海,各显神通」,本⽂作者以Python语⾔为⼯具进⾏机器学习,并以Kaggle竞赛中的泰坦尼克号项⽬进⾏详细解读。跟着⼩编来看看吧!
随着⾏业内机器学习的崛起,能够帮⽤户快速迭代整个过程的⼯具变得⾄关重要。Python,机器学习技术领域冉冉升起的⼀颗新星,往往是带你⾛向成功的⾸选。因此,⽤Python 实现机器学习的指南是⾮常必要的。
⽤ Python 实现机器学习的介绍
那么为什么是 Python 呢?根据我的经验,Python 是最容易学习的编程语⾔之⼀。现在需要快速迭代整个过程,与此同时,数据科学家不需要深⼊了解这种语⾔,因为他们可以快速掌握它。
有多容易呢?
for anything in the_list:
print(anything)
就这么容易。Python 的语法和英语(或⼈类语⾔,⽽不是机器语⾔)语法关系密切。在 Python 的语法中没有愚蠢的⼤括号造成的困扰。我有⼀个从事质量保证(Quality Assurance)⼯作的同事,虽然不是软件⼯程师,但她可以在⼀天内写出产品级的 Python 代码。(真的!)
我将在下⽂中介绍⼏个基于 Python 的库。作为数据分析师和数据科学家,我们可以利⽤他们的杰作来帮助我们完成任务。这些不可思议的库是⽤ Python 实现机器学习的必备⼯具。
NumPy
这是⼀个⾮常有名的数据分析库。从计算数据分布的中位数,到处理多维数组,NumPy 都可以帮你完成。
Pandas
这是⽤来处理 CSV ⽂件的。当然了,你还需要处理⼀些表格、查看统计数据等,那 Pandas 就是可以满⾜你的需求的⼯具。
Matplotlib
把数据存储在 Pandas 的数据框后,你可能需要做⼀些可视化来理解数据的更多信息。毕竟⼀图抵千⾔。
Seaborn
这是另⼀个可视化⼯具,但这个⼯具更侧重于统计结果的可视化,⽐如直⽅图、饼图、曲线图或相关性表等。
Scikit-Learn
这是⽤ Python 实现机器学习的终极⼯具。所谓⽤ Python 实现机器学习指的就是这个——Scikit-Learn。所有你需要的从算法到提升的内容都能在这⾥到。
Tensorflow 和 Pytorch
针对这两个⼯具我不会说太多。但如果你对深度学习感兴趣的话,可以详细了解⼀下,它们值得你花时间去学习。(我下次会再写⼀篇关于深度学习的教程,敬请期待!)
Python 机器学习项⽬
当然,只是阅读和学习是没法让你达成⼼愿的。你需要实际练习。正如我博客中所说的,如果你没有深⼊数据的话,那学习这些⼯具将毫⽆意义。因此,我在这⾥介绍⼀个可以轻松到 Python 机器学习项⽬的地⽅。
Kaggle 是⼀个可以直接研究数据的平台。你可以在这个平台中解决⼀些项⽬,并达到真的擅长机器学习的地步。你可能更感兴趣另外⼀些东西——Kaggle 举办的机器学习竞赛,奖⾦⾼达 100,000 美元。你可能会想着碰碰运⽓,哈哈。
但最重要的并不是钱——你真的可以在这⾥到⽤ Python 实现的机器学习项⽬。你可以试着完成很多项⽬。但如果你是个新⼿,你可能会想参加这项竞赛。
我们将在后⾯的教程中⽤到⼀个⽰例项⽬:
这就是众所周知的泰坦尼克号。这是⼀场发⽣在 1912 年的灾难,这场灾难波及到的乘客和机组成员共 2224 ⼈,其中 1502 ⼈遇难死亡。这项 Kaggle 竞赛(或者说是教程)提供了灾难中的真实数据。你的任务是解释这些数据,并预测出灾难中哪些⼈会活下来,哪些⼈不会。
⽤ Python 实现机器学习的教程
在深⼊了解泰坦尼克号的数据之前,我们要先安装⼀些必需的⼯具。
⾸先当然是 Python。第⼀次安装 Python 需要从官⽹上安装。你要安装 3.6 以上的版本,这样才能跟最新版本的库保持同步。
然后可以⽤ Python 的 pip 安装所有的库。你刚刚下载的 Python 发⾏版会⾃动安装 pip。
需要的其他⼯具都可以⽤ pip 安装。打开终端、命令⾏或 PowerShell,命令如下:
pip install numpy
pip install pandaspip install matplotlibpip install seabornpip install scikit-learnpip install jupyter
看起来⼀切都运⾏良好。但是等⼀下,什么叫 jupyter?jupyter 表⽰ Julia、Python 和 R,因此它实际上是 Jupytr。但这个单词看起来太奇怪了,所以他们把它变成了 Jupyter。这是⼀个很有名的笔记本,你可以在这个笔记本上写交互式的 Python 代码。
只要在终端中输⼊ jupyter notebook,就可以打开如下图所⽰的浏览器页⾯:
你可以把代码写在绿⾊矩形中,⽽且可以交互式地编写并评价 Python 代码。
现在你已经安装了所有的⼯具。我们开始吧!
数据探索
探索数据是第⼀步。你需要从 Kaggle 的 Titanic 页⾯下载数据,然后将下载的数据放到你启动 Jupyter 笔记本的⽂件夹中。
然后导⼊必要的库:
import numpy as np
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')%matplotlib inline
载⼊数据:
train_ad_csv("train.csv")
train_df.head()
输出如下:
这就是我们的数据。它有下⾯⼏列:
PassengerId,乘客的标识符;
Survived,他(她)是否存活了下来;
Pclass,舱室类别,也许 1 表⽰经济舱,2 表⽰商务舱,3 表⽰头等舱;
Name,乘客的名字;
Sex,性别;
Age,年龄;
SibSp,即兄弟妹(siblings)或配偶(spouses),表⽰在船上的兄弟妹以及配偶的数⽬;
Parch,即⽗母(Parents)或⼦⼥(Children),表⽰在船上的⽗母和⼦⼥的数⽬;
Ticket,船票详情;
Cabin,舱号,NaN 表⽰未知;
Embarked,登船的起始地,S 表⽰南安普顿(Southampton),Q 表⽰皇后镇(Queenstown),C 表⽰瑟堡(Cherbourg)
在探索数据时,常常会遇到数据缺失的问题。我们来看⼀下
def missingdata(data):
total = data.isnull().sum().sort_values(ascending = False) percent = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending = False) at([total, percent], axis=1, keys=
['Total', 'Percent']) ms= ms[ms["Percent"] > 0] f,ax =plt.subplots(figsize=
(8,6)) icks(rotation='90') fig=sns.barplot(ms.index, ms["Percent"],color="green",alpha=0.8) plt.xlabel('Features', fontsize=15) plt.ylabel('Percent of missing values', fontsize=15) plt.title(
我们会看到这样的结果:
舱号、年龄以及登船地的数据都有⼀些缺失值,⽽舱号信息有⼤量的缺失。我们需要对它们进⾏处理,也就是所谓的数据清理(Data Cleaning)。
数据清理
我们 90% 的时间都花在这上⾯。我们要针对每⼀个机器学习项⽬进⾏⼤量的数据清理。当数据清理⼲净时,我们就可以轻松地进⾏下⼀步了,什么都不⽤担⼼。
数据清理中最常⽤的技术是填充缺失数据。你可以⽤众数、平均数或中位数来填充缺失数据。选择这些数据没有绝对规则,你可以⼀⼀尝试,然后看看它们的表现如何。但是根
据经验来讲,分类数据只能⽤众数,连续数据可以⽤中位数或平均数。所以我们⽤众数来填充登船地数据,⽤中位数来填充年龄数据。
train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace = True)
train_df['Age'].fillna(train_df['Age'].median(), inplace = True)
接下来的重要操作是删除数据,尤其针对⼤量缺失的数据。我们针对舱号数据进⾏以下处理:
drop_column = ['Cabin']
train_df.drop(drop_column, axis=1, inplace = True)
现在检查⼀下清理过的数据。
print('check the nan value in train data')
print(train_df.isnull().sum())
完美!没有任何缺失数据了!这表⽰数据已经清理⼲净了。
特征⼯程
现在数据已经清理⼲净了。接下来我们要进⾏特征⼯程。
特征⼯程基本上就是根据当前可⽤数据发现特征或数据的技术。有⼏种⽅法可以实现这种技术。在很多时候这都是常识。
我们以登船地数据为例——这是⽤ Q、S 或 C 填充的数据。Python 库不能处理这个,因为它只能处理数字。所以你需要⽤所谓的独热向量化(One Hot Vectorization)来处理,
它可以把⼀列变成三列。⽤ 0 或 1 填充 Embarked_Q、Embarked_S 和 Embarked_C,来表⽰这个⼈是不是从这个港⼝出发的。
再以 SibSp 和 Parch 为例。这两列没有什么有趣的,但是你可能会想知道某个乘客有多少家⼈登上了这艘船。如果家⼈多的话可能会增加⽣存⼏率,因为他们可以互相帮助。从
另⼀个⾓度说,单独登船的乘客可能很难⽣存下去。
因此你可以创建新的⼀列,这⼀列是成员数量(family size),family size = SibSp + Parch + 1(乘客⾃⼰)。
最后⼀个例⼦是以 bin 列为例的。由于你认为很难区分具有相似值的事物,所以这种操作创建了值范围(ranges of values),然后将多个值组合在⼀起。⽐如,5 岁和 6 岁的乘
客之间有显著的差异吗?或者 45 和 46 岁的⼈之间有显著的差异吗?
这就是创建 bin 列的原因。也许就年龄⽽⾔,我们可以创建 4 列——幼⼉(0~14 岁)、青少年(14~20 岁)、成年⼈(20~40 岁)以及年长的⼈(40 岁以上)。
编码如下:
all_data = train_df
for dataset in all_data : dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1import re# Define function to extract titles from passenger namesdef get_title(name): title_search = re.search(
Za-
z]+).', name) # If the title exists, extract and return it. if title_search: return up(1) return ""# Create a new feature Title, containing the titles of passenger namesfor dataset common titles into one single grouping "Rare"for dataset in all_data: dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev',
[0,14,20,40,120], labels=['Children','Teenage','Adult','Elder'])for dataset in all_data: dataset['Fare_bin'] = pd.cut(dataset['Fare'], bins=
[0,7.91,14.45,31,120], labels ['Low_fare','median_fare', 'Average_fare','high_fare'])traindf=train_dffor dataset in traindf: drop_column = ['Age','Fare','Name','Ticket'] dataset.drop(drop_column, axis= ["Sex","Title","Age_type","Em_type","Fare_type"])
现在,你已经创建完成所有的特征了。接着我们看看这些特征之间的相关性:python新手代码例子
sns.(),annot=True,cmap='RdYlGn',linewidths=0.2) #()-->correlation matrix
f()fig.set_size_inches(20,12)plt.show()
相关值接近 1 意味着⾼度正相关,-1 意味着⾼度负相关。例如,性别为男和性别为⼥之间就呈负相关,因为必须将乘客识别为⼀种性别(或另⼀种)。此外,你还可以看到,除
了⽤特征⼯程创建的内容外,没有哪两种是⾼度相关的。这证明我们做得对。
如果某些因素之间⾼度相关会怎么样?我们可以删除其中的⼀个,新列中的信息并不能给系统提供任何新信息,因为这两者是完全⼀样的。
⽤ Python 实现机器学习
现在我们已经到达本教程的⾼潮——机器学习建模。
del_selection import train_test_split #for split the data
ics import accuracy_score #for accuracy_del_selection import KFold #for K-
fold cross del_selection import cross_val_score #score del_selection import cross_val_predict #ics import confusion_matr Scikit-Learn 库中有多种算法供你选择:
逻辑回归
随机森林
⽀持向量机
K 最近邻
朴素贝叶斯
决策树
AdaBoost
LDA
梯度增强
你可能感到不知所措,想弄清什么是什么。别担⼼,只要将它当做「⿊箱」对待就好——选⼀个表现最好的。
以我最喜欢的随机森林算法为例:
semble import RandomForestClassifier
model = RandomForestClassifier(criterion='gini', n_estimators=700, min_samples_split=10,min_samples_leaf=1, max_features='auto',oob_score=True, ra 1)model.fit(X_train,y_train)prediction_rm=model.predict(X_test)print('--------------The Accuracy of the model----------------------------
')print('The accuracy of the Random Forest Classifier is', round(accuracy_score(prediction_rm,y_test)*100,2))kfold = KFold(n_splits=10, random_state=22) # k=10, split the data into 10 equal partsresult_哇哦!准确率⾼达 83%。就第⼀次尝试⽽⾔,这个结果已经很好了。
交叉验证分数的意思是 K 折验证⽅法。如果 K=10,就是说要把数据分成 10 个变量,计算所有分数的均值,并将它们作为最终分数。
微调
现在你已经完成了⽤ Python 实现机器学习的步骤。但再加⼀个步骤可以让你得到更好的结果——微调。微调的意思是为机器学习算法到最佳参数。以上⾯的随机森林代码为
例:
model = RandomForestClassifier(criterion='gini', n_estimators=700,
min_samples_split=10,min_samples_leaf=1, max_features='auto',oob_score=True, random_state=1,n_jobs=-1)
你需要设置许多参数。顺便说⼀下,上⾯的都是默认值。你可以根据需要改变参数。但当然了,这需要花费很多时间。
别担⼼——有⼀种叫做⽹格搜索(Grid Search)的⼯具,它可以⾃动出最佳参数。听起来还不错,对吧?
# Random Forest Classifier Parameters tunning
model = RandomForestClassifier()n_estim=range(100,1000,100)## Search grid for optimal parametersparam_grid = {"n_estimators" :n_estim}model_rf = GridSearchCV(model,param_grid = param_grid 好了,你可以⾃⼰尝试⼀下,并从中享受机器学习的乐趣。
总结
怎么样?机器学习看起来似乎并不难吧?⽤ Python 实现机器学习很简单。⼀切都已经为你准备好了。你可以做⼀些神奇的事,并给⼈们带来快乐。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论