随着行业内机器学习的兴起,对能够帮助您快速迭代整个过程的工具的需求变得至关重要。Python是机器学习技术的后起之秀,它通常是你获得成功的第一选择。因此,使用Python进行机器学习的指导是非常必要的。
Python机器学习入门
那么,为什么会是Python呢?根据我的经验,Python是最容易学习的编程语言之一。有必要快速迭代这个过程,而数据科学家不需要对该语言有深入的了解,因为他们可以很容易掌握这门语言的技巧。
究竟有多容易呢?
for anything in the_list:
print(anything)
非常容易~语法与英语(或人类语言,而不是机器)密切相关。也没有愚蠢的大括号迷惑人类。我有一个从事质量保证工作而不是软件工程师的同事,她可以在一天之内编写生产级别的Python代码。(相信我,这是真的!)
因此,我们将在下面讨论的库的构建者选择Python作为他们的语言选择。作为一个数据分析师和科学家,我们可以用他们的杰作来帮助我们完成任务。这些是不可思议的库,它们是使用Python进行机器学习的必备工具。
- Numpy:著名的数值分析图书馆。它将帮助您做许多事情,从计算数据分布的中值到处理多维数组。
- Pandas:用于处理CSV文件。当然,您将需要处理一些表,并查看统计数据,这是您想要使用的正确工具。
- Matplotlib:在您将数据存储在Pandas数据帧中之后,您可能需要一些可视化来了解更多关于数据的信息。图片比千言万语都要好。
- Seaborn:这也是另一个可视化工具,但更侧重于统计可视化。比如直方图,饼状图,曲线,或者相关表格。
- Scikit-Learn:这是Python机器学习的最后一个工具。Python所谓的机器学习就是这个Scikit-Learn。所有你需要的东西,从算法到改进都在这里。
- Tensorflow和Pytorch:关于这两个我没有讲太多。但如果你对深度学习感兴趣,那就看看它们吧,它们值得你花时间去学习。
Python机器学习项目
当然,独自阅读和学习并不能把你带到你需要去的地方。你需要更实际的练习。如果你不深入研究数据,学习这些工具就毫无意义。因此,我将向您介绍一个可以轻松找到Python机器学习项目的地方。
Kaggle是一个可以直接进入数据的平台。你将解决项目,并真正擅长机器学习。一些可能会让你对它更感兴趣的事情:它举办的机器学习竞赛可能会给你高达10万美元的奖金。你可以碰碰运气。哈哈。
但是,最重要的不是钱——它实际上是一个可以通过Python项目找到机器学习的地方。你可以尝试很多项目。但是如果你是一个新手,我猜你会想参加这个比赛。
下面是我们将在下面的教程中使用的一个示例项目:
泰坦尼克号:从灾难中的机器学习
是的,臭名昭著的泰坦尼克号。1912年发生的一场悲剧性灾难夺走了2224名乘客和机组人员中的1502人的生命。Kaggle竞赛(或者我可以说教程)提供了关于灾难的真实数据。你的任务是解释这些数据,这样你就可以预测一个人是否在事故中幸存下来。
机器学习与Python教程
在深入研究泰坦尼克号的数据之前,让我们先安装一些您需要的工具。
当然是Python。您需要首先从Python官方网站安装它。您需要安装3.6+版本才能与库保持同步。
之后,需要通过Python pip安装所有库。应该使用您刚刚下载的Python发行版自动安装Pip。
然后通过pip安装所需的东西。打开终端、命令行或Powershell,并编写以下代码:
pip install numpy
pip install pandas
pip install matplotlib
pip install seaborn
pip install scikit-learn
pip install jupyter
一切看起来都很好。等等,jupyter是什么?Jupyter代表Julia, Python和R,因此jupyter。但是这是一个奇怪的单词组合,所以他们把它改成了jupyter。它是一个著名的笔记本,您可以在其中交互式地编写Python代码。
只要在你的终端机上输入jupyter notebook,你就会打开一个浏览器页面,如下图所示:
在绿色矩形内编写代码,可以交互式地编写和计算Python代码。
现在您已经安装了所有的工具。我们开始吧!
数据探索
第一步是研究数据。你需要从Kaggle的泰坦尼克页面下载数据。然后把提取的数据放在一个文件夹里,在那里启动你的jupyter notebook。
然后导入必要的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
然后加载数据:
train_df=pd.read_csv("train.csv")
train_df.head()
您将看到如下内容:
这就是我们的数据。它有以下列:
- 乘客id,乘客的标识符
- 幸存,不管他/她是否幸存
- Pclass,服务的等级,也许1是经济舱,2是商务舱,3是头等舱
- 名字,乘客的名字
- 性别
- 年龄
- 一同上船的兄弟姐妹或配偶的人数
- 或家长和孩子,他们的人数
- 票,票的细节
- 客舱,他们的房间。NaN意味着未知
- 登船,出发的起点,S代表南安普顿,Q代表昆士敦,C代表切尔堡。
在研究数据时,我们经常会发现丢失的数据。让我们看一下:
def missingdata(data):
total = data.isnull().sum().sort_values(ascending = False)
percent = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending = False)
ms=pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
ms= ms[ms["Percent"] > 0]
f,ax =plt.subplots(figsize=(8,6))
plt.xticks(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('Percent missing data by feature', fontsize=15)
return msmissingdata(train_df)
我们将看到这样的结果:
客舱、年龄和装载数据有一些缺失的值。客舱信息基本缺失。我们需要对他们做些什么。这就是我们所说的数据清理。
数据清理
我们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库不能处理这些数据,因为它只能处理数字。所以你需要做一些叫做热矢量化的东西,把一列变成三列。让我们假设登上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岁以上)。
让我们对它们进行编码:
all_data = train_dffor dataset in all_data :
dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1import re
# Define function to extract titles from passenger names
def get_title(name):
title_search = re.search(' ([A-Za-z]+)\.', name)
# If the title exists, extract and return it.
if title_search:
return title_search.group(1)
return ""
# Create a new feature Title, containing the titles of passenger names
for dataset in all_data:
dataset['Title'] = dataset['Name'].apply(get_title)
# Group all non-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', 'Sir', 'Jonkheer', 'Dona'], 'Rare')dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')for dataset in all_data:
dataset['Age_bin'] = pd.cut(dataset['Age'], bins=[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_df
for dataset in traindf:
drop_column = ['Age','Fare','Name','Ticket']
dataset.drop(drop_column, axis=1, inplace = True)
drop_column = ['PassengerId']
traindf.drop(drop_column, axis=1, inplace = True)
traindf = pd.get_dummies(traindf, columns = ["Sex","Title","Age_bin","Embarked","Fare_bin"],
prefix=["Sex","Title","Age_type","Em_type","Fare_type"])
现在,您已经完成了所有功能。让我们来看看每个特征的相关性:
sns.heatmap(traindf.corr(),annot=True,cmap='RdYlGn',linewidths=0.2) #data.corr()-->correlation matrix
fig=plt.gcf()
fig.set_size_inches(20,12)
plt.show()
与值1的相关性为正相关,-1为负相关。例如,性别男性和性别女性之间会有负相关,因为乘客必须确定自己是男性还是女性。除此之外,您可以看到除了通过功能工程创建的内容之外,没有与任何高度相关的内容。这意味着我们可以离开了。
如果某件事与另一件事高度相关,会发生什么?我们可以删除其中一个,因为通过新列添加其他信息不会给系统提供新信息,因为它们完全相同。
Python机器学习
现在我们已经到达了本教程的顶点:机器学习建模。
from sklearn.model_selection import train_test_split #for split the data
from sklearn.metrics import accuracy_score #for accuracy_score
from sklearn.model_selection import KFold #for K-fold cross validation
from sklearn.model_selection import cross_val_score #score evaluation
from sklearn.model_selection import cross_val_predict #prediction
from sklearn.metrics import confusion_matrix #for confusion matrix
all_features = traindf.drop("Survived",axis=1)
Targeted_feature = traindf["Survived"]
X_train,X_test,y_train,y_test = train_test_split(all_features,Targeted_feature,test_size=0.3,random_state=42)
X_train.shape,X_test.shape,y_train.shape,y_test.shape
您可以选择包含在scikit-learn库中的许多算法。
- 逻辑回归
- 随机森林
- 支持向量机
- 邻近算法
- 朴素贝叶斯
- 决策树
- AdaBoost法
- LDA算法
- Gradient Boosting算法
你可能会不知所措,试图弄清楚什么是什么。别担心,把它当作一个黑匣子:选择一个性能最好的。
让我们用我最喜欢的一个来试试:随机森林算法
from sklearn.ensemble import RandomForestClassifier
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)
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 parts
result_rm=cross_val_score(model,all_features,Targeted_feature,cv=10,scoring='accuracy')
print('The cross validated score for Random Forest Classifier is:',round(result_rm.mean()*100,2))
y_pred = cross_val_predict(model,all_features,Targeted_feature,cv=10)
sns.heatmap(confusion_matrix(Targeted_feature,y_pred),annot=True,fmt='3.0f',cmap="summer")
plt.title('Confusion_matrix', y=1.05, size=15)
哇!它给出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 parameters
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
print(model_rf.best_score_)#best estimator
model_rf.best_estimator_
你可以自己试试。享受机器学习的乐趣。
结论
怎么样?看起来不太难吧,是吗?使用Python进行机器学习很容易。一切都为你安排好了。现在你可以开始你的魔术,给人们带来神奇体验了。