前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十分钟机器学习入门

十分钟机器学习入门

作者头像
AiTechYun
发布2019-05-14 15:12:47
4290
发布2019-05-14 15:12:47
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

随着行业内机器学习的兴起,对能够帮助您快速迭代整个过程的工具的需求变得至关重要。Python是机器学习技术的后起之秀,它通常是你获得成功的第一选择。因此,使用Python进行机器学习的指导是非常必要的。

Python机器学习入门

那么,为什么会是Python呢?根据我的经验,Python是最容易学习的编程语言之一。有必要快速迭代这个过程,而数据科学家不需要对该语言有深入的了解,因为他们可以很容易掌握这门语言的技巧。

究竟有多容易呢?

代码语言:javascript
复制
1 for anything in the_list:
2    print(anything)
非常容易~语法与英语(或人类语言,而不是机器)密切相关。也没有愚蠢的大括号迷惑人类。我有一个从事质量保证工作而不是软件工程师的同事,她可以在一天之内编写生产级别的Python代码。(相信我,这是真的!)

因此,我们将在下面讨论的库的构建者选择Python作为他们的语言选择。作为一个数据分析师和科学家,我们可以用他们的杰作来帮助我们完成任务。这些是不可思议的库,它们是使用Python进行机器学习的必备工具。

  1. Numpy:著名的数值分析图书馆。它将帮助您做许多事情,从计算数据分布的中值到处理多维数组。
  2. Pandas:用于处理CSV文件。当然,您将需要处理一些表,并查看统计数据,这是您想要使用的正确工具。
  3. Matplotlib:在您将数据存储在Pandas数据帧中之后,您可能需要一些可视化来了解更多关于数据的信息。图片比千言万语都要好。
  4. Seaborn:这也是另一个可视化工具,但更侧重于统计可视化。比如直方图,饼状图,曲线,或者相关表格。
  5. Scikit-Learn:这是Python机器学习的最后一个工具。Python所谓的机器学习就是这个Scikit-Learn。所有你需要的东西,从算法到改进都在这里。
  6. Tensorflow和Pytorch:关于这两个我没有讲太多。但如果你对深度学习感兴趣,那就看看它们吧,它们值得你花时间去学习。

Python机器学习项目

当然,独自阅读和学习并不能把你带到你需要去的地方。你需要更实际的练习。如果你不深入研究数据,学习这些工具就毫无意义。因此,我将向您介绍一个可以轻松找到Python机器学习项目的地方。

Kaggle是一个可以直接进入数据的平台。你将解决项目,并真正擅长机器学习。一些可能会让你对它更感兴趣的事情:它举办的机器学习竞赛可能会给你高达10万美元的奖金。你可以碰碰运气。哈哈。

但是,最重要的不是钱——它实际上是一个可以通过Python项目找到机器学习的地方。你可以尝试很多项目。但是如果你是一个新手,我猜你会想参加这个比赛。

下面是我们将在下面的教程中使用的一个示例项目:

泰坦尼克号:从灾难中的机器学习

是的,臭名昭著的泰坦尼克号。1912年发生的一场悲剧性灾难夺走了2224名乘客和机组人员中的1502人的生命。Kaggle竞赛(或者我可以说教程)提供了关于灾难的真实数据。你的任务是解释这些数据,这样你就可以预测一个人是否在事故中幸存下来。

机器学习与Python教程

在深入研究泰坦尼克号的数据之前,让我们先安装一些您需要的工具。

当然是Python。您需要首先从Python官方网站安装它。您需要安装3.6+版本才能与库保持同步。

之后,需要通过Python pip安装所有库。应该使用您刚刚下载的Python发行版自动安装Pip。

然后通过pip安装所需的东西。打开终端、命令行或Powershell,并编写以下代码:

代码语言:javascript
复制
1 pip install numpy
2 pip install pandas
3 pip install matplotlib
4 pip install seaborn
5 pip install scikit-learn
6 pip install jupyter

一切看起来都很好。等等,jupyter是什么?Jupyter代表Julia, Python和R,因此jupyter。但是这是一个奇怪的单词组合,所以他们把它改成了jupyter。它是一个著名的笔记本,您可以在其中交互式地编写Python代码。

只要在你的终端机上输入jupyter notebook,你就会打开一个浏览器页面,如下图所示:

在绿色矩形内编写代码,可以交互式地编写和计算Python代码。

现在您已经安装了所有的工具。我们开始吧!

数据探索

第一步是研究数据。你需要从Kaggle的泰坦尼克页面下载数据。然后把提取的数据放在一个文件夹里,在那里启动你的jupyter notebook。

然后导入必要的库:

代码语言:javascript
复制
1 import numpy as np
2 import pandas as pd
3 import matplotlib.pyplot as plt
4 import seaborn as sns
5 import warnings
6 warnings.filterwarnings('ignore')
7 %matplotlib inline

然后加载数据:

代码语言:javascript
复制
1 train_df=pd.read_csv("train.csv")
2 train_df.head()

您将看到如下内容:

这就是我们的数据。它有以下列:

  1. 乘客id,乘客的标识符
  2. 幸存,不管他/她是否幸存
  3. Pclass,服务的等级,也许1是经济舱,2是商务舱,3是头等舱
  4. 名字,乘客的名字
  5. 性别
  6. 年龄
  7. 一同上船的兄弟姐妹或配偶的人数
  8. 或家长和孩子,他们的人数
  9. 票,票的细节
  10. 客舱,他们的房间。NaN意味着未知
  11. 登船,出发的起点,S代表南安普顿,Q代表昆士敦,C代表切尔堡。

在研究数据时,我们经常会发现丢失的数据。让我们看一下:

代码语言:javascript
复制
 1 def missingdata(data):
 2 total = data.isnull().sum().sort_values(ascending = False)
 3 percent = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending = False)
 4 ms=pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
 5 ms= ms[ms["Percent"] > 0]
 6 f,ax =plt.subplots(figsize=(8,6))
 7 plt.xticks(rotation='90')
 8 fig=sns.barplot(ms.index, ms["Percent"],color="green",alpha=0.8)
 9 plt.xlabel('Features', fontsize=15)
10 plt.ylabel('Percent of missing values', fontsize=15)
11 plt.title('Percent missing data by feature', fontsize=15)
12 return msmissingdata(train_df)

我们将看到这样的结果:

客舱、年龄和装载数据有一些缺失的值。客舱信息基本缺失。我们需要对他们做些什么。这就是我们所说的数据清理。

数据清理

我们90%的时间都在用这个。我们将为每一个机器学习项目做大量的数据清理。当数据干净时,我们可以轻松地跳到下一步,而不用担心任何事情。

数据清理中最常见的技术是填充丢失的数据。您可以使用模式、平均值或中间值来填充缺失的数据。对于这些选择并没有绝对的规则——您可以尝试逐个选择并查看性能。但是,根据经验,您只能对分类数据使用模式,对连续数据可以使用中间值或平均值。

让我们用模式填充登船数据,用中间值填充年龄数据。

代码语言:javascript
复制
1train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace = True)
2train_df['Age'].fillna(train_df['Age'].median(), inplace = True)

下一个重要的技术是删除数据,特别是对于大部分缺失的数据。我们来计算舱室数据。

代码语言:javascript
复制
1drop_column = ['Cabin']
2train_df.drop(drop_column, axis=1, inplace = True)

现在我们可以检查已经清理的数据。

代码语言:javascript
复制
1 print('check the nan value in train data')
2 print(train_df.isnull().sum())

完美!没有发现丢失的数据。表示数据已被清除。

特征工程

现在我们已经清理了数据。接下来我们要做的是特征工程。

特征工程基本上是一种从当前可用的数据中寻找特征或数据的技术。有几种方法可以做到这一点。更多时候,这是常识的问题。

让我们看一下已装载的数据:它由Q、S或C填充。Python库不能处理这些数据,因为它只能处理数字。所以你需要做一些叫做热矢量化的东西,把一列变成三列。让我们假设登上Q、S和C不管这个人是否从那个港口上船都是0或1。

另一个例子是SibSp和Parch。也许这两栏没有什么有趣的,但你可能想知道登上这艘船的乘客的家庭有多大。你可能会认为,如果家庭规模更大,那么生存的机会就会增加,因为他们可以互相帮助。另一方面,独自生活的人会过得很艰难。

因此,您希望创建另一个名为family size的列,它由sibsp + parch + 1(乘客本身)组成。

最后一个示例称为bin列。这是一种创建值范围的技术,用于将多个事物组合在一起,因为您假定很难区分具有相似值的事物。例如,年龄。对于一个5岁和6岁的人来说,有什么显著的区别吗?或者对于45岁和46岁的人来说,有什么大的区别吗?

这就是我们创建bin列的原因。也许对于年龄,我们会创建4个箱子。儿童(0-14岁)、青少年(14-20岁)、成人(20-40岁)及长者(40岁以上)。

让我们对它们进行编码:

代码语言:javascript
复制
 1 all_data = train_dffor dataset in all_data :
 2 dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1import re
 3 # Define function to extract titles from passenger names
 4 def get_title(name):
 5 title_search = re.search(' ([A-Za-z]+)\.', name)
 6 # If the title exists, extract and return it.
 7 if title_search:
 8 return title_search.group(1)
 9 return ""
10 # Create a new feature Title, containing the titles of passenger names
11 for dataset in all_data:
12 dataset['Title'] = dataset['Name'].apply(get_title)
13 # Group all non-common titles into one single grouping "Rare"
14 for dataset in all_data:
15 dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don',
16 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
17 dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
18 dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')for dataset in all_data:
19 dataset['Age_bin'] = pd.cut(dataset['Age'], bins=[0,14,20,40,120], labels=['Children','Teenage','Adult','Elder'])for dataset in all_data:
20 dataset['Fare_bin'] = pd.cut(dataset['Fare'], bins=[0,7.91,14.45,31,120], labels ['Low_fare','median_fare', 'Average_fare','high_fare'])
21
22 traindf=train_df
23 for dataset in traindf:
24 drop_column = ['Age','Fare','Name','Ticket']
25 dataset.drop(drop_column, axis=1, inplace = True)
26
27 drop_column = ['PassengerId']
28 traindf.drop(drop_column, axis=1, inplace = True)
29 traindf = pd.get_dummies(traindf, columns = ["Sex","Title","Age_bin","Embarked","Fare_bin"],
30 prefix=["Sex","Title","Age_type","Em_type","Fare_type"])

现在,您已经完成了所有功能。让我们来看看每个特征的相关性:

代码语言:javascript
复制
1 sns.heatmap(traindf.corr(),annot=True,cmap='RdYlGn',linewidths=0.2) #data.corr()-->correlation matrix
2 fig=plt.gcf()
3 fig.set_size_inches(20,12)
4 plt.show()

与值1的相关性为正相关,-1为负相关。例如,性别男性和性别女性之间会有负相关,因为乘客必须确定自己是男性还是女性。除此之外,您可以看到除了通过功能工程创建的内容之外,没有与任何高度相关的内容。这意味着我们可以离开了。

如果某件事与另一件事高度相关,会发生什么?我们可以删除其中一个,因为通过新列添加其他信息不会给系统提供新信息,因为它们完全相同。

Python机器学习

现在我们已经到达了本教程的顶点:机器学习建模。

代码语言:javascript
复制
 1 from sklearn.model_selection import train_test_split #for split the data
 2 from sklearn.metrics import accuracy_score  #for accuracy_score
 3 from sklearn.model_selection import KFold #for K-fold cross validation
 4 from sklearn.model_selection import cross_val_score #score evaluation
 5 from sklearn.model_selection import cross_val_predict #prediction
 6 from sklearn.metrics import confusion_matrix #for confusion matrix
 7 all_features = traindf.drop("Survived",axis=1)
 8 Targeted_feature = traindf["Survived"]
 9 X_train,X_test,y_train,y_test = train_test_split(all_features,Targeted_feature,test_size=0.3,random_state=42)
10 X_train.shape,X_test.shape,y_train.shape,y_test.shape

您可以选择包含在scikit-learn库中的许多算法。

  1. 逻辑回归
  2. 随机森林
  3. 支持向量机
  4. 邻近算法
  5. 朴素贝叶斯
  6. 决策树
  7. AdaBoost法
  8. LDA算法
  9. Gradient Boosting算法

你可能会不知所措,试图弄清楚什么是什么。别担心,把它当作一个黑匣子:选择一个性能最好的。

让我们用我最喜欢的一个来试试:随机森林算法

代码语言:javascript
复制
 1 from sklearn.ensemble import RandomForestClassifier
 2 model = RandomForestClassifier(criterion='gini', n_estimators=700,
 3 min_samples_split=10,min_samples_leaf=1,
 4 max_features='auto',oob_score=True,
 5 random_state=1,n_jobs=-1)
 6 model.fit(X_train,y_train)
 7 prediction_rm=model.predict(X_test)
 8 print('--------------The Accuracy of the model----------------------------')
 9 print('The accuracy of the Random Forest Classifier is', round(accuracy_score(prediction_rm,y_test)*100,2))
10 kfold = KFold(n_splits=10, random_state=22) # k=10, split the data into 10 equal parts
11 result_rm=cross_val_score(model,all_features,Targeted_feature,cv=10,scoring='accuracy')
12 print('The cross validated score for Random Forest Classifier is:',round(result_rm.mean()*100,2))
13 y_pred = cross_val_predict(model,all_features,Targeted_feature,cv=10)
14 sns.heatmap(confusion_matrix(Targeted_feature,y_pred),annot=True,fmt='3.0f',cmap="summer")
15 plt.title('Confusion_matrix', y=1.05, size=15)

哇!它给出83%的准确率。这对我们第一次来说已经足够好了。

交叉验证分数表示K倍验证方法。如果K = 10,则表示将数据分成10个变量,并计算所有得分的平均值作为最终得分。

微调

现您已在经完成了使用Python进行机器学习的步骤。但是,还有一个步骤可以为您带来更好的结果:微调。微调意味着为机器学习算法找到最佳参数。如果你看到上面随机森林的代码:

代码语言:javascript
复制
1 model = RandomForestClassifier(criterion='gini', n_estimators=700,
2 min_samples_split=10,min_samples_leaf=1,
3 max_features='auto',oob_score=True,
4 random_state=1,n_jobs=-1)

您需要设置许多参数。顺便说一下,这些是缺省值。你可以随意改变参数。但当然,这需要很多时间。

不要担心——有一个叫做 Grid Search网格搜索的工具,它可以自动找到最优参数。听起来不错,对吧?

代码语言:javascript
复制
1 # Random Forest Classifier Parameters tunning
2 model = RandomForestClassifier()
3 n_estim=range(100,1000,100)## Search grid for optimal parameters
4 param_grid = {"n_estimators" :n_estim}model_rf = GridSearchCV(model,param_grid = param_grid, cv=5, scoring="accuracy", n_jobs= 4, verbose = 1)model_rf.fit(train_X,train_Y)# Best score
5 print(model_rf.best_score_)#best estimator
6 model_rf.best_estimator_

你可以自己试试。享受机器学习的乐趣。

结论

怎么样?看起来不太难吧,是吗?使用Python进行机器学习很容易。一切都为你安排好了。现在你可以开始你的魔术,给人们带来神奇体验了。

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档