随着行业内机器学习的兴起,对能够帮助您快速迭代整个过程的工具的需求变得至关重要。Python是机器学习技术的后起之秀,它通常是你获得成功的第一选择。因此,使用Python进行机器学习的指导是非常必要的。
Python机器学习入门
那么,为什么会是Python呢?根据我的经验,Python是最容易学习的编程语言之一。有必要快速迭代这个过程,而数据科学家不需要对该语言有深入的了解,因为他们可以很容易掌握这门语言的技巧。
究竟有多容易呢?
1 for anything in the_list:
2 print(anything)
非常容易~语法与英语(或人类语言,而不是机器)密切相关。也没有愚蠢的大括号迷惑人类。我有一个从事质量保证工作而不是软件工程师的同事,她可以在一天之内编写生产级别的Python代码。(相信我,这是真的!)
因此,我们将在下面讨论的库的构建者选择Python作为他们的语言选择。作为一个数据分析师和科学家,我们可以用他们的杰作来帮助我们完成任务。这些是不可思议的库,它们是使用Python进行机器学习的必备工具。
Python机器学习项目
当然,独自阅读和学习并不能把你带到你需要去的地方。你需要更实际的练习。如果你不深入研究数据,学习这些工具就毫无意义。因此,我将向您介绍一个可以轻松找到Python机器学习项目的地方。
Kaggle是一个可以直接进入数据的平台。你将解决项目,并真正擅长机器学习。一些可能会让你对它更感兴趣的事情:它举办的机器学习竞赛可能会给你高达10万美元的奖金。你可以碰碰运气。哈哈。
但是,最重要的不是钱——它实际上是一个可以通过Python项目找到机器学习的地方。你可以尝试很多项目。但是如果你是一个新手,我猜你会想参加这个比赛。
下面是我们将在下面的教程中使用的一个示例项目:
泰坦尼克号:从灾难中的机器学习
是的,臭名昭著的泰坦尼克号。1912年发生的一场悲剧性灾难夺走了2224名乘客和机组人员中的1502人的生命。Kaggle竞赛(或者我可以说教程)提供了关于灾难的真实数据。你的任务是解释这些数据,这样你就可以预测一个人是否在事故中幸存下来。
机器学习与Python教程
在深入研究泰坦尼克号的数据之前,让我们先安装一些您需要的工具。
当然是Python。您需要首先从Python官方网站安装它。您需要安装3.6+版本才能与库保持同步。
之后,需要通过Python pip安装所有库。应该使用您刚刚下载的Python发行版自动安装Pip。
然后通过pip安装所需的东西。打开终端、命令行或Powershell,并编写以下代码:
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。
然后导入必要的库:
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
然后加载数据:
1 train_df=pd.read_csv("train.csv")
2 train_df.head()
您将看到如下内容:
这就是我们的数据。它有以下列:
在研究数据时,我们经常会发现丢失的数据。让我们看一下:
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%的时间都在用这个。我们将为每一个机器学习项目做大量的数据清理。当数据干净时,我们可以轻松地跳到下一步,而不用担心任何事情。
数据清理中最常见的技术是填充丢失的数据。您可以使用模式、平均值或中间值来填充缺失的数据。对于这些选择并没有绝对的规则——您可以尝试逐个选择并查看性能。但是,根据经验,您只能对分类数据使用模式,对连续数据可以使用中间值或平均值。
让我们用模式填充登船数据,用中间值填充年龄数据。
1train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace = True)
2train_df['Age'].fillna(train_df['Age'].median(), inplace = True)
下一个重要的技术是删除数据,特别是对于大部分缺失的数据。我们来计算舱室数据。
1drop_column = ['Cabin']
2train_df.drop(drop_column, axis=1, inplace = True)
现在我们可以检查已经清理的数据。
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岁以上)。
让我们对它们进行编码:
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"])
现在,您已经完成了所有功能。让我们来看看每个特征的相关性:
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机器学习
现在我们已经到达了本教程的顶点:机器学习建模。
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 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进行机器学习的步骤。但是,还有一个步骤可以为您带来更好的结果:微调。微调意味着为机器学习算法找到最佳参数。如果你看到上面随机森林的代码:
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网格搜索的工具,它可以自动找到最优参数。听起来不错,对吧?
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