零基础入门_如何做一个基于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)不同犯罪类型的数量统计
图一(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编码转为数值型
在这里插入图片描述在这里插入图片描述

(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利器

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值