零基础入门机器学习 Kaggle_Crime_Prediction

文章目录

  • 零基础入门机器学习 Kaggle_Crime_Prediction
    • 题目回顾
    • 前言
      • 0.1 在开始处调用库(首先针对绘图)
      • 0.2 用pandas载入csv训练和测试数据,进而可以进行数据的分析
    • 一、 进行数据的初步分析及特征分析
      • 1.1 Category(要预测的目标变量)
      • 1.2 DayOfWeek
      • 1.3 PdDistrict
      • 1.4 year/month/day
      • 1.5 在星期几的某一个时刻的犯罪数量
      • 1.6 Address
      • 1.7 Resolution
      • 1.8 Descript
      • 1.9 位置坐标 X Y
      • 1.10 数量前6的犯罪类别与hour的关系
      • 1.11 数量前6的犯罪类别与month的关系
      • 1.12 数量前6的犯罪类别与year的关系
    • 二、进行数据处理
      • 2.1 对分类目标做标签化处理
      • 2.2 对train数据进行二值化处理并组合特征
      • 2.3 对test数据进行同样二值化处理并组合特征
    • 三、建立模型并验证评估模型效果
      • 3.1 引入sklearn中的log_loss
      • 3.2 选取特征
      • 3.3 交叉验证的方法
      • 3.4 划分数据集
      • 3.5 从sklearn库中 导入模型进行训练
        • (1)朴素贝叶斯
        • (2)逻辑回归
        • (3)随机森林
    • 四、调用库总结及速查
      • NumPy
      • Matplotlib
      • Pandas
      • Seaborn
      • String
      • Matplotlib.colors
      • Time
      • Preprocessing
      • Sklearn.preprocessing
      • Sklearn.model_selection
      • Sklearn.naive_bayes
      • Sklearn.linear_model
      • Sklearn.ensemble
      • Sklearn.metrics
      • Sklearn
    • 五、总结

题目回顾

题目名称:犯罪预测

题目简介:你需要根据相关数据来预测可能发生的犯罪类型。 训练数据位于train.csv,测试数据位于test.csv,最终你需要提交你对测试集的预测结果。

数据介绍:此数据集包含来⾃犯罪事件报告系统事件。 数据范围为1/1/2003⾄2015年5⽉13⽇。每条数据仅包含 ⼀种犯罪。

数据字段:Dates - 犯罪事件的时间戳 Category - 犯罪事件的类别 (仅在train.csv出现), 这是需要预测的⽬标变 量。 Descript - 犯罪事件的详细描述 (仅在train.csv出现) DayOfWeek - 星期⼏ PdDistrict - 警察局区的名称 Resolution - 如何解决犯罪事件 (仅在train.csv出现) Address - 犯罪事件的⼤致街道地址 X - 经度 Y - 纬度

TIPS

相关python包推荐:scikit-learn, numpy, csv

相关经验的话我⽐较懒,可以搜索以下内容获取更多信息。

google: “python 预测分类问题”

google: “kaggle 泰坦尼克号实战”

前言

准备工作:换镜像源并用cmd命令行安装需要的库和包(萌新费力的步骤)

0.1 在开始处调用库(首先针对绘图)

在使用python库之前必须引入python库 使用import代码

import numpy as np    # 科学计算
import matplotlib.pyplot as plt    # python绘图库
import pandas as pd    # 数据分析
import seaborn as sns  # 作图
import string
import matplotlib.colors as colors  # 添加颜色
0.2 用pandas载入csv训练和测试数据,进而可以进行数据的分析
train = pd.read_csv("D:\Computer\kaggle machine learning/task/train.csv")
test = pd.read_csv("D:\Computer\kaggle machine learning/task/test.csv")
train.info()
test.info()      #获取文件中的数据类型及数目

输出结果如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 600000 entries, 0 to 599999
Data columns (total 9 columns):
Dates         600000 non-null object
Category      600000 non-null object
Descript      600000 non-null object
DayOfWeek     600000 non-null object
PdDistrict    600000 non-null object
Resolution    600000 non-null object
Address       600000 non-null object
X             600000 non-null float64
Y             600000 non-null float64
dtypes: float64(2), object(7)
memory usage: 41.2+ MB
Data columns (total 6 columns):
Dates         250000 non-null object
DayOfWeek     250000 non-null object
PdDistrict    250000 non-null object
Address       250000 non-null object
X             250000 non-null float64
Y             250000 non-null float64
dtypes: float64(2), object(4)
memory usage: 11.4+ MB
print(train.isnull().sum()) # 查看数据中有没有缺失项
Dates         0
Category      0
Descript      0
DayOfWeek     0
PdDistrict    0
Resolution    0
Address       0
X             0
Y             0
dtype: int64
print(test.isnull().sum())
Dates         0
DayOfWeek     0
PdDistrict    0
Address       0
X             0
Y             0
dtype: int64

发现train训练集数据60w条,test测试集数据25w条,数据没有缺失的数据。

一、 进行数据的初步分析及特征分析

1.1 Category(要预测的目标变量)
print(train['Category'].describe())
count            600000
unique               39
top       LARCENY/THEFT
freq             119238
Name: Category, dtype: object
cate_group = train.groupby(by='Category').size()
cate_group
cate_num = len(cate_group.index)
cate_num
cate_group.index = cate_group.index.map(string.capwords)
cate_group.sort_values(ascending=False,inplace=True)
# ascending=False按降序排序,指定inplace=True,将同时修改原数据
cate_group.plot(kind='bar',color=sns.color_palette('coolwarm',cate_num))
# 补充logy=True 绘制y轴的对数图形(把图形放大,看得更细腻,大佬操作)
plt.title('Number of Crime types')plt.show()


​ 如果我们使用的是指数形式呢(使用logy=True启用对数)

我们通过观察易得6种数量最多的犯罪类型如下:

Category
ASSAULT
DRUG/NARCOTIC
LARCENY/THEFT
NON-CRIMINAL
OTHER OFFENSES
VEHICLE THEFT
1.2 DayOfWeek
print(train['DayOfWeek'].describe())
count     600000
unique         7
top       Friday
freq       91634
Name: DayOfWeek, dtype: object
Day_group = train.groupby(by='DayOfWeek').size()
Day_group
Day_num = len(Day_group.index)
Day_num
Day_group.index = Day_group.index.map(string.capwords)
Day_group.sort_values(ascending=False,inplace=True)
Day_group.plot(kind='bar',color=sns.color_palette('coolwarm',Day_num))
plt.title('The Number of Crime types')plt.show()

分析:在一周内,星期五犯罪数量最多,星期天犯罪数量最少,总的来说一周中五天的犯罪数目差距 不是很大,基本在80000+

1.3 PdDistrict
print(train['PdDistrict'].describe())
count       600000
unique          10
top       SOUTHERN
freq        107457
Name: PdDistrict, dtype: object
dis_group = train.groupby(by='PdDistrict').size()
dis_group
dis_group = dis_group/sum(dis_group)
dis_group.index = dis_group.index.map(string.capwords)
dis_group.sort_values(ascending=True,inplace=True)
dis_group.plot(kind='barh',figsize=(15,10),fontsize=10,color=sns.color_palette('coolwarm',10))
plt.title('The Frequncy of crimes by district',fontsize=15)plt.show()

分析:犯罪的高频发生区域在Southern,其次是Mission Northern,Richmond是治安最好,犯罪情况与 PdDistrict有关联

1.4 year/month/day
由于我们需要对年月日分开分析,所以我们需要将year/month/day这样形式的字符分开
所以需要以下代码进行分析
fig=plt.figure()
fig.set(alpha=0.2)#转化dates数据字段字符串类型为date数据类型 把date的三个量分离开
train['Dates']=pd.to_datetime(train['Dates'])
train['year'] = train.Dates.dt.year
train['month'] = train.Dates.dt.month
train['day'] = train.Dates.dt.day
train['hour'] = train.Dates.dt.hourplt.subplot2grid((3,1),(0,0))
year_group = data_train.groupby(by='year').size()
plt.plot(year_group.index[:-1],year_group[:-1],'ks-')
plt.title('statistics of criminal cases  measured by year')
plt.xlabel('year')
plt.ylabel('number of people')plt.subplot2grid((3,1),(1,0))
month_group = data_train.groupby(by='month').size()
plt.plot(month_group,'ks-')
plt.title('statistics of criminal cases measured by month')
plt.xlabel('month')
plt.ylabel('number of people')plt.subplot2grid((3,1),(2,0))
day_group = data_train.groupby(by='day').size()
plt.plot(day_group,'ks-')
plt.title('statistics of criminal cases measured by day')
plt.xlabel('day')
plt.ylabel('number of people')

输出将时间字段字符串分离后的部分数据情况 如下(数据说明已经成功分解)

year          600000 non-null int64
month         600000 non-null int64
day           600000 non-null int64
hour          600000 non-null int64
dtypes: datetime64[ns](1), float64(2), int64(5), object(4)

分析:2011年犯罪数量最少,2011年之后的数量激增,到2013年犯罪数量最多;8月份犯罪数量最少,犯罪数量最多的月份为10月份 5月份;除了月初和月末又明显的波动外,一个月内犯罪数目并没有显著的变化,基本稳定在171500-20000人。对于day的数据,更趋近于线性关系。

1.5 在星期几的某一个时刻的犯罪数量
week_group = train.groupby(['DayOfWeek','hour']).size()     #多重分组
week_group = week_group.unstack()     #对分组后的多重索引转为xy索引
week_group.T.plot(figsize=(12,8))     #行列互换后画图
plt.xlabel('hour of day',size=15)
plt.ylabel('Number of crimes',size=15)plt.show()

数据分析:12点和18点的犯罪数量最多,在凌晨数量开始显著下降,不同的时段犯罪数差别很大

PS.一定需要小心一点,groupby([‘DayOfWeek’,‘hour’])中的hour是没有定义的,所以我必须出现前面的一行 代 码(将年月日中的三个参数分离开)如下:

train['hour'] = train.Dates.dt.hour
1.6 Address
print(train['Address'].describe())
count                     600000
unique                     22262
top       800 Block of BRYANT ST
freq                       18064
Name: Address, dtype: object

由上表可知:Address的数据种类很多,分布很零散,维度很大,选取特征困难

1.7 Resolution

​ (数据只在训练集上)

print(train['Resolution'].describe())
count     600000
unique        17
top         NONE
freq      359779
Name: Resolution, dtype: object

分析:发现仅仅只有三种Resolution的数据比较多,其他的数据相对很少

1.8 Descript

​ (数据只在训练集上)

print(train['Descript'].describe())
count                           600000
unique                             862
top       GRAND THEFT FROM LOCKED AUTO
freq                             41046

分析:发现Descript的数据有862种,分布散乱,情况仅次于Address

1.9 位置坐标 X Y
print(train['X'].describe())
print(train['Y'].describe())
count    600000.000000
mean       -122.422635
std           0.030175
min        -122.513642
25%        -122.432956
50%        -122.416442
75%        -122.406959
max        -120.500000
Name: X, dtype: float64count    600000.000000
mean         37.770856
std           0.447932
min          37.707920
25%          37.752441
50%          37.775421
75%          37.784353
max          90.000000
Name: Y, dtype: float64

分析:没有画出坐标图像,但是X和Y的坐标的std(标准差)分别为0.030175、0.447932,显然都非常小,所以说明地理位置坐标的变化幅度并不大,该参数并不会对结果产生太明显的影响。

1.10 数量前6的犯罪类别与hour的关系
top6 = list(cate_group.index[:6])
tmp = train[train['Category'].map(string.capwords).isin(top6)]
tmp_group = tmp.groupby(['Category','hour']).size()
tmp_group = tmp_group.unstack()
tmp_group.T.plot(figsize=(12,6),style='o-')plt.show()

分析:5点以后数量开始上升,12和18时出现数量峰值,不同的时段对于不同的犯罪情况均有影响。

1.11 数量前6的犯罪类别与month的关系
mon_g = tmp.groupby(['Category','month']).size()
mon_g = mon_g.unstack()
for i in range(6):mon_g.iloc[i] = mon_g.iloc[i]/mon_g.sum(axis=1)[i]
mon_g.T.plot(figsize=(12,6),style='o-')plt.show()

分析:不同的月份对犯罪有很大的影响,5和10月是犯罪的峰值,ASSAULT对峰值做出贡献

1.12 数量前6的犯罪类别与year的关系
mon_g = tmp.groupby(['Category','year']).size()
mon_g = mon_g.unstack()
for i in range(6):mon_g.iloc[i] = mon_g.iloc[i]/mon_g.sum(axis=1)[i]
mon_g.T.plot(figsize=(12,6),style='o-')plt.show()

分析:非常明显,2003~2006年VEHICLE THEFT的犯罪率极高,而后来偏低,各种犯罪类型频率在2014年(可能是治安变好了)开始显著下降

二、进行数据处理

#引入python中的sklearn库from sklearn import preprocessing
#from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
#from sklearn.feature_selection import SelectKBest
#from sklearn.feature_selection import chi2
2.1 对分类目标做标签化处理
#对分类目标做标签化处理from sklearn.preprocessing import LabelEncoder      #用于Label编码
from sklearn.preprocessing import OneHotEncoder     #用于one-hot编码
label = preprocessing.LabelEncoder()
target = label.fit_transform(train.Category)
target
crime = label.fit_transform(train.Category)
#对test数据中的Dates进行同样的分离处理test['date'] = pd.to_datetime(test['Dates'])
test['year'] = test.date.dt.year
test['month'] = test.date.dt.month
test['day'] = test.date.dt.day
test['hour'] = test.date.dt.hourtest.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 250000 entries, 0 to 249999
Data columns (total 10 columns):
Dates         250000 non-null datetime64[ns]
DayOfWeek     250000 non-null object
PdDistrict    250000 non-null object
Address       250000 non-null object
X             250000 non-null float64
Y             250000 non-null float64
year          250000 non-null int64
month         250000 non-null int64
day           250000 non-null int64
hour          250000 non-null int64
dtypes: datetime64[ns](1), float64(2), int64(4), object(3)
memory usage: 19.1+ MB
2.2 对train数据进行二值化处理并组合特征
#将train数据因子化
days = pd.get_dummies(train.DayOfWeek)
district = pd.get_dummies(train.PdDistrict)
hour = pd.get_dummies(train.Dates.dt.hour)
month = pd.get_dummies(train.Dates.dt.month)
year = pd.get_dummies(train.Dates.dt.year)#组合train特征
train= pd.concat([days,district,hour,month,year], axis=1)
train['crime'] = crime
2.3 对test数据进行同样二值化处理并组合特征
#将test数据因子化
days = pd.get_dummies(test.DayOfWeek)
district = pd.get_dummies(test.PdDistrict)
hour = pd.get_dummies(test.Dates.dt.hour)
test= pd.concat([days, district, hour], axis=1)
month = pd.get_dummies(test.Dates.dt.month)
year = pd.get_dummies(test.Dates.dt.year)#组合test特征
test = pd.concat([days, district, hour,month,year],axis=1)

上述二值化处理过程是因为我们需要将数据放进0-1的范围内进行处理

需要构造并运用的sigF(x)sigF(x)sigF(x)如图所示:

δ(z)=11+e−z.\delta(z)=\frac{1}{1+e^{-z}}.δ(z)=1+e−z1​.


输出处理后的数据情况如下:

print(train.head(10))
print(test.head(10))
 Friday  Monday  Saturday  Sunday  Thursday  ...  2012  2013  2014  2015  crime
0       0       1         0       0         0  ...     0     0     0     0     16
1       0       1         0       0         0  ...     0     0     0     0     25
2       0       1         0       0         0  ...     0     0     0     0     21
3       0       1         0       0         0  ...     0     0     0     0     21
4       0       1         0       0         0  ...     0     0     0     0     16
5       0       1         0       0         0  ...     0     0     0     0     35
6       0       1         0       0         0  ...     0     0     0     0     34
7       0       1         0       0         0  ...     0     0     0     0     21
8       0       1         0       0         0  ...     0     0     0     0      1
9       0       1         0       0         0  ...     0     0     0     0     21[10 rows x 67 columns]Friday  Monday  Saturday  Sunday  Thursday  ...  2011  2012  2013  2014  2015
0       0       1         0       0         0  ...     0     0     0     0     0
1       0       1         0       0         0  ...     0     0     0     0     0
2       0       1         0       0         0  ...     0     0     0     0     0
3       0       1         0       0         0  ...     0     0     0     0     0
4       0       1         0       0         0  ...     0     0     0     0     0
5       0       1         0       0         0  ...     0     0     0     0     0
6       0       1         0       0         0  ...     0     0     0     0     0
7       0       1         0       0         0  ...     0     0     0     0     0
8       0       1         0       0         0  ...     0     0     0     0     0
9       0       1         0       0         0  ...     0     0     0     0     0[10 rows x 66 columns]

三、建立模型并验证评估模型效果

3.1 引入sklearn中的log_loss
from sklearn.metrics import log_loss
import time
3.2 选取特征

然后既然是建模,我们就需要选取特征进行模型拟合,这里首先选取days和PdDistrict,代码如下:

features = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION','NORTHERN', 'PARK', 'RICHMOND', 'SOUTHERN', 'TARAVAL', 'TENDERLOIN']#然后添加三种时间数据参数到特征中
hourFea = [x for x in range(0,24)]
monFea = [x for x in range(1,12)]
yearFea = [x for x in range(2003,2015)]features = features + hourFea + monFea + yearFea
3.3 交叉验证的方法

交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。于是我们在3.4步骤中划分该数据集。

3.4 划分数据集
#我们按照训练集6/10 测试集4/10 来划分数据集
X_train,X_test,y_train,y_test = train_test_split(train[features], train['crime'] , train_size = 0.6)
#代码解释
#X_是划分的数据集即train[features]选取特征的训练集划分为X_train,X_test两个部分,比例为3:2
#y_是划分的标签集即train['crime']打上的标签集划分为y_train,y_test两个部分
#然后让我们看看划分的数据情况吧
print("The length of original data is:", train[features].shape[0])
print("The length of train Data is:", X_train.shape[0])
print("The length of test Data is:", X_test.shape[0])
The length of original data X is: 600000
The length of train Data is: 360000
The length of test Data is: 240000
3.5 从sklearn库中 导入模型进行训练
(1)朴素贝叶斯

​ 模型公式:

P(Yk∣X)=P(XYk)P(X)=P(Yk)P(X∣Y)∑jP(Yj)P(X∣Yj).P(Y_k|X)=\frac{P(XY_k)}{P(X)}=\frac{P(Y_k)P(X|Y)}{\sum_j P(Y_j)P(X|Y_j)}.P(Yk​∣X)=P(X)P(XYk​)​=∑j​P(Yj​)P(X∣Yj​)P(Yk​)P(X∣Y)​.

  • 公式的右边是总结历史
  • 公式的左边是预知未来
  • 如果把Y看成类别,XXX看成特征,P(Yk∣X)P(Y_k|X)P(Yk​∣X)就是在已知特征XXX的情况下求YkY_kYk​类别的概率,而对P(Yk∣X)P(Y_k|X)P(Yk​∣X)的计算又全部转化到类别YkY_kYk​的特征分布上来。
  • 朴素贝叶斯的概念:独立性假设,假设各个特征之间是独立不相关的。

y=f(x)=argmaxP(Y=ck∣X=x)=argmaxP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck).y=f(x)=argmax P(Y=c_k|X=x)=argmax\frac{P(Y=c_k)\prod_j P(X^{(j)}=x^{(j)}|Y=c_k)}{\sum_k P(Y=c_k)\prod_j P(X^{(j)}=x^{(j)}|Y=c_k)}.y=f(x)=argmaxP(Y=ck​∣X=x)=argmax∑k​P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)​.

  • 当特征为为xxx时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,即

y=f(x)=argmaxP(Y=ck)∏jP(X(j)=x(j)∣Y=ck).y=f(x)=argmax P(Y=c_k)\prod_{j} P(X^{(j)}=x^{(j)}|Y=c_k).y=f(x)=argmaxP(Y=ck​)j∏​P(X(j)=x(j)∣Y=ck​).

朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。

贝叶斯定理旨在计算P(A∣B)P(A|B)P(A∣B)的值,也就是在已知B发生的条件下,A发生的概率是多少。大多数情况下,B是被观察事件,比如“昨天下雨了”,A为预测结果“今天会下雨”。对数据挖掘来说,B通常是观察样本个体,A为被预测个体所属类别。所以,说简单一点,贝叶斯就是计算的是:B是A类别的概率。
P(A∣B)=P(B∣A)P(A)P(B).P(A|B)=\frac{P(B|A)P(A)}{P(B)}.P(A∣B)=P(B)P(B∣A)P(A)​.

我个人对这个模型的理解就是 条件概率

代码实现如下:

from sklearn.naive_bayes import BernoulliNB
NB = BernoulliNB()
nbStart = time.time()
NB.fit(X_train,y_train)
nbCostTime = time.time() - nbStart
predicted = np.array(NB.predict_proba(X_test))print("BernoulliNB cost time=%fs" %(nbCostTime))
print("BernoulliNB log_loss=%f" %(log_loss(y_test, predicted)))
BernoulliNB cost time=0.709103s
BernoulliNB log_loss=2.584169
from sklearn.naive_bayes import MultinomialNB
NB = MultinomialNB()
nbStart = time.time()
NB.fit(X_train,y_train)
nbCostTime = time.time() - nbStart
predicted = np.array(NB.predict_proba(X_test))print("BernoulliNB cost time=%fs" %(nbCostTime))
print("BernoulliNB log_loss=%f" %(log_loss(y_test, predicted)))
BernoulliNB cost time=0.631253s
BernoulliNB log_loss=2.585822
(2)逻辑回归

逻辑回归也被称为对数几率回归

逻辑回归模型是一种分类模型,用条件概率分布的形式表示P(Y∣X)P(Y∣X)P(Y|X)P(Y|X)P(Y∣X)P(Y∣X),这里随机变量 XXX 取值为 nnn 维实数向量,例如x=(x(1),x(2),...,x(n))x=(x(1),x(2),...,x(n))x=(x(1),x(2),...,x(n))x=(x(1),x(2),...,x(n))x=(x(1),x(2),...,x(n))x=(x(1),x(2),...,x(n)),YYY取值为 0 或 1

二分类问题,输出为y∈(0,1)y\in{(0,1)}y∈(0,1),二线性回归模型z=wTx+bz=wTx+bz=w^Tx+bz=w^Tx+bz=wTx+bz=wTx+b是个实数值,我们希望有一个理想的阶跃函数来帮我什么实现zzz值到0/1值的转化,于是找到了SigmoidSigmoidSigmoid函数来代替:
δ(z)=11+e−z.\delta(z)=\frac{1}{1+e^{-z}}.δ(z)=1+e−z1​.


用了该函数后取值范围在[0,1]。就可以将其视为类 1 的后验概率估计 P(y=1∣X)P(y=1∣X)P(y=1|X)P(y=1|X)P(y=1∣X)P(y=1∣X)就是如果有了一个测试点 xxx,那么就可以用SigmoidSigmoidSigmoid函数算出来的结果当作该点 xxx 属于类别 1 的概率大小。

于是,非常自然地,我们把 SigmoidSigmoidSigmoid 函数计算得到的值大于等于0.5的归为类别1,小于0.5的归为类别0

逻辑函数的损失函数
J(θ)=12m∑i=0m(ϕ(xi)−yi)2.J(\theta)=\frac{1}{2m}\sum_{i=0}^m (\phi(x^i)-y^i)^2.J(θ)=2m1​i=0∑m​(ϕ(xi)−yi)2.

逻辑回归的模型求解
ϕ′(z)=ϕ(z)(1−ϕ(z)).\phi'(z)=\phi(z)(1-\phi(z)).ϕ′(z)=ϕ(z)(1−ϕ(z)).

代码实现如下:

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=.01)
lrStart= time.time()
lr.fit(X_train,y_train)
lrCostTime = time.time() - lrStart
predicted = np.array(lr.predict_proba(X_test))print("LogisticRegression cost time=%fs" %(lrCostTime))
print("LogisticRegression log_loss=%f" %(log_loss(y_test, predicted)))

计算结果输出如下:

LogisticRegression cost time=53.516026s
LogisticRegression log_loss=2.579390
(3)随机森林

训练数据集

D=(x1,y1),(x2,y2),...,(xn,yn).D={{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)}}.D=(x1​,y1​),(x2​,y2​),...,(xn​,yn​).

样本子集的个数 TTT

输出:最终的强分类器

(1)对 t=1,2,...T.t=1,2,...T.t=1,2,...T.

(a)从原始样本集中随机的抽取m个样本点,得到一个训练集。

(b)用训练集,训练一个CART决策树,这里在训练的过程中,对每个节点的切分规则是先从所有特征中随机的选择k个特征,然后在从这k个特征中选择最优的切分点在做左右子树的划分。

(2)如果是分类算法,则预测的最终类别为该样本点所到叶节点中投票数最多的类别;如果是回归算法,则最终的类别为该样本点所到叶节点的均值。

代码实现如下:

from sklearn.ensemble import RandomForestClassifier
params = [17,18,19]   # 通过循环结构跑不同的随机森林树深度
for par in params:clf = RandomForestClassifier(n_estimators=300, max_depth=par)clf.fit(X_train,y_train)predicted = np.array(clf.predict_proba(X_test))print("depths_RandomForestClassifier log_loss=%f" %(log_loss(y_test, predicted))
depths_RandomForestClassifier log_loss=2.561306
depths_RandomForestClassifier log_loss=2.559973
depths_RandomForestClassifier log_loss=2.559018

四、调用库总结及速查

NumPy

(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

import numpy as np
Matplotlib

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

import matplotlib.pyplot as plt
Pandas

pandas 是基于numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。

import pandas as pd
Seaborn

Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。在matplotlib的基础上进行了更高级的API封装。

import seaborn as sns
String

import string就是引入string模块,使得我们可以调用与字符串操作相关的函数。

import string
Matplotlib.colors

给图像润色的过程

import matplotlib.colors as colors
Time

计算模型的计算时间

import time
Preprocessing

预处理数据

from sklearn import preprocessing
Sklearn.preprocessing

数据的标签化处理

from sklearn.preprocessing import LabelEncoder      #用于Label编码
from sklearn.preprocessing import OneHotEncoder     #用于one-hot编码
Sklearn.model_selection

划分数据集 交叉验证

from sklearn.model_selection import train_test_split
Sklearn.naive_bayes

导入朴素贝叶斯模型

from sklearn.naive_bayes import BernoulliNB
Sklearn.linear_model

导入线性回归算法

from sklearn.linear_model import LogisticRegression
Sklearn.ensemble

导入随机森林模型 集成学习思想

from sklearn.ensemble import RandomForestClassifier
Sklearn.metrics

模型效果验证与评估函数

from sklearn.metrics import log_loss
Sklearn

是python中功能非常强大的库,比如在导入模型的时候,可以省去相当多的模型代码,直接把我们的参数扔进这个模型就可以实现。例如:NB.fit(X_train,y_train)就可以同时实现训练集中划分数据集和划分训练标签的模型拟合过程。

五、总结

如题,纯萌新零基础机器学习入门。从10月份零基础开始学习机器学习,探索这道题的时间是一个月。在这一个月内,前期卡壳时间很长,学习如何用cmd命令行安装python的各种需要的库,后面过程做起来稍微快一些。整个过程可以数据分析(趋势预测 权重分析 可能的数据剔除清洗等等)选择合适的特征进行模型训练,并实现对不完整数据的预测。这个模型其实用得并不好,太多地方都可以提高精度,比如在特征的划分上就可以根据不同时间区间的数量不同来细化特征,把特征工程做到更高的精度从而降低对数损失值。总的来说,整个处理过程并不优,也必然会有不少的漏洞和改进空间,这次的体验也算是给自己一次全新的学习机会,从零开始积累经验吧。

(新手向)零基础探究机器学习Crime_Prediction相关推荐

  1. 赠书五本《零基础学机器学习》

    1. 走下神坛的机器学习 我们马上就要进入20世纪的第3个十年啦,而人工智能和机器学习,也已经火了差不多有六七年的时间了. 从Hinton团队在2012年的ImageNet大赛中用神经网络模型一举夺魁 ...

  2. 送书|“零基础学机器学习”作者创作手记

    1. 走下神坛的机器学习 我们马上就要进入20世纪的第3个十年啦,而人工智能和机器学习,也已经火了差不多有六七年的时间了. 从Hinton团队在2012年的ImageNet大赛中用神经网络模型一举夺魁 ...

  3. cnn 验证集 参与训练吗_一个简单的零基础的机器学习教程之二,字母数字验证码识别...

    一.前言 基于前面我发的贴子 土味程序员:一个简单的零基础的机器学习教程,Pytorch搭建Faster R-CNN目标检测平台​zhuanlan.zhihu.com 一个非常震撼的目标检测的例子.上 ...

  4. 集成学习精讲01 - SAP大神黄佳新作《零基础学机器学习》节选

    球赛中,防守方的联防策略是非常有效的,几个队员彼此照应,随时协防.换位.补位,护送等,相互帮助,作为一个整体作战,而集成学习,就是机器学习里面的协同作战!如果你训练出一个模型比较弱,又训练出一个模型还 ...

  5. 黄佳《零基础学机器学习》chap2笔记

    黄佳 <零基础学机器学习> chap2笔记 第2课 数学和Python基础知识 文章目录 黄佳 <零基础学机器学习> chap2笔记 第2课 数学和Python基础知识 2.1 ...

  6. 集成学习精讲之Boosting - SAP大神黄佳新作《零基础学机器学习》节选

    Boosting的意思就是提升,这是一族通过训练弱学习模型的肌肉将其提升为强学习模型的算法.要想在机器学习竞赛中追求卓越,Boosting是一种必须的存在.这是一个属于高手的技术. 图片来源于网上,侵 ...

  7. 黄佳《零基础学机器学习》chap1笔记

    黄佳 <零基础学机器学习> chap1笔记 这本书实在是让我眼前一亮!!! 感觉写的真的太棒了! 文章目录 黄佳 <零基础学机器学习> chap1笔记 第1课 机器学习快速上手 ...

  8. 集成学习精讲02 - Bagging方法:多个基模型的聚合(SAP大神黄佳新作《零基础学机器学习》节选)

    我们将分为5篇文章介绍集成学习,分别是: 集成学习基础知识:偏差和方差 - 戳此阅读 Bagging - Boosting - 戳此阅读 Stacking/Blending - 戳此阅读 Voting ...

  9. 黄佳《零基础学机器学习》chap3笔记

    黄佳 <零基础学机器学习> chap3笔记 第3课 线性回归--预测网店的销售额 文章目录 黄佳 <零基础学机器学习> chap3笔记 第3课 线性回归--预测网店的销售额 3 ...

最新文章

  1. 数组取10个元素_不知道取什么样的英文名,看看老外最喜欢取的10个男孩和女孩名...
  2. c++语言编辑简单的计算器,c++编写简单的计算器程序
  3. 常见Java面试题 在Queue中poll()和remove()有什么区别?
  4. Docker~从Dockerfile到Container的过程
  5. 走几步回头看看企业即时通讯
  6. 阿里云搭建nacos
  7. 开源Granados介绍 - SSH连接远程Linux服务器(C#)
  8. flask get和post
  9. UVA - 815 Flooded!
  10. [转]VC 键盘虚拟码
  11. 电脑小手图标怎么去除_图文教你去除桌面图标箭头_消除电脑图标小箭头的方法-系统城...
  12. App Store审核规范
  13. mysql及格率公式_关于mysql进行名次的排名和计算及格率的分享
  14. 0/0型极限等于多少_两个重要极限的一点理解(下)
  15. 计算机主机中包,百度地图脱机包最终可以在计算机上导入
  16. 国家队入场,中国数字资产交易市场或将迎来新一轮“洗牌”
  17. IgH详解六、IgH命令行工具使用
  18. lambda-1-lambda简介
  19. 牛客网——求最小公倍数
  20. 记录mybatis添加表数据时报出的错误:Could not set property ‘id‘ of ‘class com.xxx.Manager with value ‘xx...xx‘

热门文章

  1. 头脑王者服务器维护,头脑王者请求超时怎么解决 头脑王者查询服务器失败怎么回事...
  2. C++入门教程(四十二):函数参数使用引用
  3. 网卡构造:MAC与PHY的关系,GMAC介绍
  4. WiFi6特性,一起深入学习,OFDMA,QAM调制,BSS
  5. Akka Dispatchers和Routers
  6. 想要无所不能的女秘书,用Office 365啊
  7. EF Attatch()方法附加对象
  8. Python学习心得——列表和元组的操作方法
  9. 十个要点让你的渲染更好
  10. 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)