零基础入门_如何做一个基于sklearn机器学习项目

零基础入门_如何做一个基于sklearn的机器学习项目

  • 前言
  • 一、获得数据
  • 二、从数据搜索和可视化中获得洞见
  • 三、机器学习算法的数据准备
  • 四、选择并训练模型
  • 五、微调模型
  • 六、启动、监控和维护系统


前言

本文将介绍一个kaggle犯罪案件分类的项目案例。以下是你将经历的主要步骤:(本文不详细阐述具体做法,只为熟悉机器学习项目的整个操作流程。)

1、获得数据
2、从数据搜索和可视化中获得洞见
3、机器学习算法的数据准备
4、选择并训练模型
5、微调模型
6、启动、监控和维护系统

可以使用jupyter notebook来编写、调试程序。

一、获得数据

学习机器学习最好使用真实数据进行实验,而不仅仅是人工数据集。我们有成千上万覆盖了各个领域的开放数据可以选择。以下是一些可以获得数据的地方。

  • 流行的开放数据存储库

1)UC Irvine Machine Learning Repository(http://archive.ics.uci.edu/ml/)
2)Kaggle datasets(https://www.kaggle.com/datasets)
3)Amazon’s AWS datasets(http://aws.amazon.com/fr/datasets/)

  • 元门户站点(它们会列出开放的数据存储库)

1)Data Portals(http://dataportals.org/)
2)OpenDataMonitor(http://opendatamonitor.eu/)
3)Quandl(http://quandl.com/)

  • 其他一些列出许多流行的开放数据存储库的页面

1)Wikipedia’s list of Machine Learning datasets(https://goo.gl/SJHN2k)
2)Quora.com(http://goo.gl/zDR78y)
3)The datasets subreddit(https://www.reddit.com/r/datasets)

本章我们从https://www.kaggle.com/datasets中选择数据集。包括train.csv和test.csv。

二、从数据搜索和可视化中获得洞见

获取到数据之后,我们可以利用一些可视化来分析数据。用python来做可视化是很方便的。下面是我们要用到的一些包:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time as systime
import datetime as dt
import string
import seaborn as sns
import matplotlib.colors as colors
%matplotlib inline

每个包的详细用法:
Numpy
Pandas
Matplotlib
这几个包可以实现基本的可视化需求,像条形图,折线图等。
那么,我们以kaggle犯罪案件分类的项目为分析对象,对数据进行可视化分析,如下图:
(1)不同犯罪类型的数量统计
零基础入门_如何做一个基于sklearn机器学习项目_第1张图片(2)不同犯罪类型一年中不同月份的发生率统计零基础入门_如何做一个基于sklearn机器学习项目_第2张图片从这张统计图中,可以看出不同的犯罪类型变化趋势基本一致。但是,1-2月份有个别案件发生率较高。这个时候,就可以考虑把这一点作为新的特征加入特征集。(这里只举出一个例子)
可视化分析的一个重要作用,就是选取新的特征。

三、机器学习算法的数据准备

kaggle犯罪案件分类的项目的数据集包括train.csv和test.csv。所涉及到的数据有:
类别特征:Dates,Descript,DayOfWeek,PdDistrict,Resolution,Address
数值型特征:X,Y,year,month,day,hour
时间特征:data
那么,我们下一步要怎样做,才能将这些数据变成计算机可以识别的数据呢?下面这些是我们要用到的库:

from sklearn import preprocessing# 预处理
from sklearn.preprocessing import MinMaxScaler #数据归一化
from sklearn.model_selection import train_test_split # 特征选择中的分割训练集和测试集
from sklearn import metrics

(1)首先,我们对分类目标做标签化处理

#对分类目标做标签化处理
#preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range
label = preprocessing.LabelEncoder()
target = label.fit_transform(train.Category)
target

(2)合并train.csv和test.csv
(3)对DayOfWeek、PdDistrict特征做one-hot编码转为数值型
零基础入门_如何做一个基于sklearn机器学习项目_第3张图片零基础入门_如何做一个基于sklearn机器学习项目_第4张图片

(4)添加新特征。结合我们前面的可视化分析,可以发现,month特征在年初会有不同,hour特征在18点以后会有不同。所以添加新特征newy和dark。

full['newy'] = full['month'].apply(lambda x:1 if x==1 or x==2 else 0)
full['dark'] = full['hour'].apply(lambda x:1 if x>=18 and x<=24 else 0)

(5)合并特征
(6)生成验证集和测试集

#生成验证集、测试集
#加入所有特征
# sklearn之train_test_split()函数各参数含义
# 在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”
# X_train,X_test, y_train, y_test =train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
# train_data:所要划分的样本特征集

# train_target:所要划分的样本结果

# test_size:样本占比,如果是整数的话就是样本的数量

# random_state:是随机数的种子。
# 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,
#保证得到一组一样的随机数。比如你每次都填1,
#其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。


X_train,X_test,y_train,y_test = train_test_split(full[:train.shape[0]],target,train_size=0.7,random_state=0)

四、选择并训练模型

至此,我们获得了数据,也对数据进行了处理,然后也得到了训练集和测试集。现在是时候选择机器学习模型并展开训练了。
该项目我们选择了逻辑回归,朴素贝叶斯和随机森林(其他的训练模型也可以进行尝试,找到最适合的模型)。那么问题来了,如何判断哪一个模型的分类效果更佳呢?这时,就要对模型进行评估。下面是一些评估方法:
(1)sklearn.metrics中的评估方法介绍(accuracy_score, recall_score, roc_curve, roc_auc_score, confusion_matrix)
(2)损失函数loss_function
(3)交叉验证
以该项目为例,训练随机森林模型并进行评估:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
params = [12,13,14,15,16]
for par in params:
    clf = RandomForestClassifier(n_estimators=30, max_depth=par)
    forest_start = time.time()
    clf.fit(X_train,y_train)
    fcost = time.time()-forest_start
    y_pred = clf.predict(X_test)
#    socres = cross_val_score(clf,X_train,y_train,scoring="neg_mean_squared_error",cv=4)
#    tree_rmse_scores=np.sqrt(-scores)
#    print("随机森林交叉验证分数:",tree_rmse_scores)
    print("model accuracy: ",metrics.accuracy_score(y_test,y_pred))
    predicted = np.array(clf.predict_proba(X_test))
    print("随机森林log损失为 %f" %(log_loss(y_test, predicted)))
    print( "随机森林建模耗时 %f 秒" %(fcost))

五、微调模型

假设你现在有了一个有模型的候选列表。现在你需要对它们进行微调,我们来看几个可行的方法。
(1)网格搜索。一种微调的方法是手动调整超参数,直到找到一组很好的超参数值组合。但是,这个过程是非常枯燥乏味的,你可能坚持不到足够的时间来探索出各种组合。
相反,你可以利用Scikit-Learn的GridSearchCV()来替你进行探索。你所要做的就是告诉它你要进行实验的超参数是什么,以及需要尝试的值。例如对随机森林进行调参:

from sklearn.model_selection import GridSearchCV
max_depth=[20]
n_estimators=[10,20,30,40]
param_grid=dict(max_depth=max_depth,n_estimators=n_estimators)

clf_one = RandomForestClassifier()
clf=GridSearchCV(clf_one,param_grid,cv=3,scoring='neg_log_loss',return_train_score=True)
Gird_start = time.time()
clf.fit(X_train,y_train)
Girdcost = time.time()-Gird_start
print(clf.best_params_)
y_pred = clf.predict(X_test) 
print("model accuracy: ",metrics.accuracy_score(y_test,y_pred))
predicted = np.array(clf.predict_proba(X_test))
print("随机森林log损失为 %f" %(log_loss(y_test, predicted)))
print( "随机森林建模耗时 %f 秒" %(Girdcost))

最后完成后你就可以获得最佳的参数组合。

(2)随机搜索。如果探索的组合数量较少,那么网格搜索是一种不错的方法。但是当超参数的搜索范围较大时,通常会优先选择使用RandomizedSearchCV。这个类用起来与GirdSearchCV大致相同,但它不会尝试所有可能的组合,而是在每次迭代中为每个超参数选择一个随机值。这个方法最大的好处就是节约时间,提高效率。
(3)集成方法。在前面的训练中,随机森林相比其他的模型分类效果更佳。因此,我们考虑使用不同的集成学习器,像bagging或者boosting。
下面是使用bagging进行训练的过程:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.metrics import f1_score,precision_score,recall_score
from sklearn.model_selection import GridSearchCV
#max_samples=[35000,40000,45000]

#param_grid=dict(max_samples=max_samples)

#clf_two = BaggingClassifier(DecisionTreeClassifier(),n_estimators=100,bootstrap=True,n_jobs=-1)
#bag_clf=GridSearchCV(clf_two,param_grid,cv=3,scoring='neg_log_loss',return_train_score=True)

bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=100,max_samples=100000,bootstrap=True,n_jobs=-1)
bag_start = time.time()
bag_clf.fit(X_train,y_train) 
bagcost = time.time()-bag_start
y_pred = bag_clf.predict(X_test) 
#print(bag_clf.best_params_)
f1=f1_score(y_test,y_pred,average='micro')
#p=precision_score(y_test,y_pred,average='micro')
#r=recall_score(y_test,y_pred,average='micro')
print("f1_score",f1)
print("model accuracy: ",metrics.accuracy_score(y_test,y_pred))

predicted = np.array(bag_clf.predict_proba(X_test))
print("bagging的log损失为 %f" %(log_loss(y_test, predicted)))
print( "bagging的建模耗时 %f 秒" %(bagcost))

针对于本项目,从训练结果看,bagging集成器的训练效果最佳。

(4)PCA降维。

六、启动、监控和维护系统

到目前,你的模型已经训练完成。现在,你需要将模型部署到生产环境中。
首先,保存训练好的Scikit-Learn模型,可以使用joblib.dump()。接着,将模型部署到云上。
如何利用streamlit快速搭建一个web应用并部署到heroku服务器上
streamlit:快速构建机器学习数据分析web app利器

你可能感兴趣的:(机器学习,python,机器学习,sklearn)