(Новичок) Исследование машинного обучения с нуля Crime_Prediction

машинное обучение искусственный интеллект

Машинное обучение входа с нуля Kaggle_Crime_Prediction

Примечание. Эта статья была написана в 2019.10 и является первым проектом машинного обучения, с которым связались блоггеры. Во многих местах рассмотрение недостаточно исчерпывающее, а пояснения в статье не к месту.

Обзор темы

Название: Предсказание преступления

Введение. Вам необходимо прогнозировать типы преступлений, которые могут произойти, на основе соответствующих данных. Данные обучения находятся в train.csv, а тестовые данные — в test.csv, Наконец, вам нужно отправить результаты прогноза для набора тестов.

Описание данных: этот набор данных содержит события из системы отчетности о преступлениях. Диапазон данных с 1 января 2003 г. по 13 мая 2015 г. Каждая часть данных содержит только одно преступление.

Поля данных: Даты — временная метка события преступления. Категория — категория события преступления (отображается только в train.csv), это целевая переменная, которую необходимо предсказать. Descript - подробное описание преступления (появляется только в train.csv) DayOfWeek - день недели PdDistrict - название полицейского участка Резолюция - как было раскрыто преступление (появляется только в train.csv) Address - примерный адрес улицы X преступление - долгота Y - широта

TIPS

Рекомендуемые пакеты Python: scikit-learn, numpy, csv.

Я ленив с точки зрения соответствующего опыта, вы можете найти следующую информацию для получения дополнительной информации.

google: "проблема классификации прогнозов Python"

google: "kaggle титаник в действии"

предисловие

Подготовка: измените источник зеркала и установите необходимые библиотеки и пакеты с помощью командной строки cmd (новые и трудоемкие шаги)

0.1 Вызов библиотеки в начале (сначала для рисования)

Должно быть перед использованием библиотеки pythonимпортировать библиотеку питонаиспользовать код импорта

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

Обнаружено, что в обучающем наборе поезда имеется 60 Вт фрагментов данных, а в тестовом наборе — 25 Вт, и в данных нет пропущенных данных.

1. Провести предварительный анализ данных и анализ признаков

1.1 Категория (целевая переменная для прогнозирования)
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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSy773ZW-1575890164350)(C:\Users\Zeng Wenxuan\AppData\Roaming\Typora\typora-user-images\1570758419411.png)]Что, если мы используем экспоненциальную форму (используйте logy=True, чтобы включить логарифмы)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvxNIutr-1575885169368)(C:\Users\Zeng Wenxuan\AppData\Roaming\Typora\typora-user-images\1570759930943.png)]

Мы заметили, что 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()

在这里插入图片描述

Анализ: Район с высокой частотой преступности находится на юге, за ним следует Северная миссия, а Ричмонд является лучшим с точки зрения общественной безопасности.

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.hour

plt.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 г., месяцем с наименьшим числом преступлений в августе и наибольшим числом преступлений в октябре и май; кроме явных колебаний в начале и конце месяца, a существенного изменения количества преступлений в течение месяца не произошло, в основном оно оставалось стабильным на уровне 171 500-20 000. Для данных дня она ближе к линейной зависимости.

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:00 и 18:00 самое высокое, ранним утром количество начинает значительно снижаться, причем количество преступлений сильно различается в разные периоды времени

PS Вы должны быть осторожны, час в groupby(['DayOfWeek','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

Из приведенной выше таблицы видно, что существует много типов адресных данных, распределение очень разбросано, размерность велика, и трудно выбрать функции.

1.7 Resolution

(данные только на тренировочном наборе)

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

在这里插入图片描述

Анализ: обнаружено, что больше данных содержится только в трех резолюциях, а остальные данные относительно малы.

1.8 Descript

(данные только на тренировочном наборе)

print(train['Descript'].describe())

count                           600000
unique                             862
top       GRAND THEFT FROM LOCKED AUTO
freq                             41046

Анализ: было обнаружено, что существует 862 вида данных дескрипта, а распределение разбросано, и ситуация уступает только адресу.

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: float64
        
count    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 составляет 0,030175 и 0,447932 соответственно, что, очевидно, очень мало, поэтому видно, что изменение географических координат невелико, и этот параметр не влияет на результаты слишком очевидное влияние.

1.10 Взаимосвязь между 6 основными категориями преступлений и часом
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 основными категориями преступлений и месяцем
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()

在这里插入图片描述

Анализ: разные месяцы оказывают большое влияние на преступность, май и октябрь — пик преступности, нападение способствует пику

1.12 Взаимосвязь между 6 основными категориями преступлений и годом
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 год, а затем был низким, а частота различных видов преступлений начала значительно снижаться в 2014 году (вероятно потому, что правопорядок стал лучше ).

2. Обработка данных

#引入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.hour

test.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数据因子化
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数据因子化
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)как показано на рисунке:

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

在这里插入图片描述

Выходные данные после обработки следующие:

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. Создайте модель и проверьте эффект модели оценки.

3.1 Представляем log_loss в sklearn
from sklearn.metrics import log_loss
import time
3.2 Выберите функции

Затем, поскольку это моделирование, нам нужновыберите функциюДля подбора модели сначала выберите дни и 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 Метод перекрестной проверки

Основная идея кросс-валидации состоит в том, чтобы сгруппировать исходные данные (набор данных) в определенном смысле, одну часть использовать в качестве обучающего набора (обучающего набора), а другую часть использовать в качестве проверочного набора (валидационного набора или тестовый набор).Классификатор обучается, а затем для проверки обученной модели используется проверочный набор, который используется в качестве индекса производительности для оценки классификатора. Итак, мы делим набор данных на шаге 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(YkX)=P(XYk)P(X)=P(Yk)P(XY)jP(Yj)P(XYj).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)}.

  • Правая часть формулы — это сводная история.
  • Левая часть формулы предсказывает будущее
  • Если рассматривать Y как категорию,XXкак особенность,P(YkX)P(Y_k|X)известные характеристикиXXв случаеYkY_kклассовые вероятности, аP(YkX)P(Y_k|X)Все расчеты преобразованы в категорииYkY_kраспределение признаков.
  • Концепция Наивного Байеса: предположение о независимости, которое предполагает, что каждый признак является независимым и некоррелированным.

y=f(x)=argmaxP(Y=ckX=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)}.

  • когда функцияxxПри вычисляется условная вероятность всех категорий и в качестве категории для классификации выбирается категория с наибольшей условной вероятностью. Поскольку знаменатель приведенной выше формулы одинаков для каждой категории, знаменатель можно не учитывать при расчете, т. е.

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).

Простота наивного байесовского метода отражается в его предположении о независимости для каждого условия, что значительно сокращает пространство гипотез параметров после добавления независимого предположения.

Теорема Байеса направлена ​​​​на вычислениеP(AB)P(A|B)Значение , то есть какова вероятность того, что произойдет А, если известно, что произойдет Б. В большинстве случаев B — это наблюдаемое событие, например «вчера шел дождь», а A — предсказанный результат «сегодня будет дождь». Для интеллектуального анализа данных B обычно является наблюдаемым индивидуумом выборки, а A — категорией, к которой принадлежит прогнозируемый индивидуум. Итак, проще говоря, байесовский подход вычисляет вероятность того, что B относится к классу A.P(AB)=P(BA)P(A)P(B).P(A|B)=\frac{P(B|A)P(A)}{P(B)}.

Мое личное понимание этой моделиУсловная возможность

Код реализован следующим образом:

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(YX)P(YX)P(Y|X)P(Y|X), где случайная величинаXXценностьnnразмерные действительные векторы, например.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)),YYПринимает значение 0 или 1

Для задачи бинарной классификации вывод:yе(0,1)y\in{(0,1)}, модель бинарной регрессииz=wTx+bz=wTx+bz=w^Tx+bz=w^Tx+bявляется реальным значением, мы хотим иметь идеальную ступенчатую функцию, которая поможет мне достичьzzПреобразование значения в значение 0/1, поэтому я нашелSigmoidSigmoidфункция вместо этого:δ(z)=11+ez.\delta(z)=\frac{1}{1+e^{-z}}. 在这里插入图片描述

После использования этой функцииДиапазон значений: [0,1]. можно рассматривать как апостериорную оценку вероятности для класса 1P(y=1X)P(y=1X)P(y=1|X)P(y=1|X)То есть если есть контрольная точкаxx, то вы можете использоватьSigmoidSigmoidРезультат, вычисленный функцией, считается точкойxxРазмер вероятности принадлежности к 1 классу.

Итак, вполне естественно, мы положилиSigmoidSigmoidЗначение, рассчитанное функцией, больше или равное 0,5 классифицируется как категория 1, а значение меньше 0,5 классифицируется как категория 0

Функция потерь для логистической функцииJ(θ)=12mi=0m(ϕ(xi)yi)2.J(\theta)=\frac{1}{2m}\sum_{i=0}^m (\phi(x^i)-y^i)^2.

Решение модели для логистической регрессииϕ'(z)=ϕ(z)(1ϕ(z)).\phi'(z)=\phi(z)(1-\phi(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)}}.

количество выборочных подмножествTT

Выход: окончательный сильный классификатор

(1 параt=1,2,...T.t=1,2,...T.

(a) Случайным образом извлеките m точек выборки из исходной выборки, чтобы получить обучающую выборку.

(б) Используйте обучающий набор для обучения дерева решений 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

(Числовой 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 — это пакет Python для визуализации графиков, основанный на matplotlib. Он предоставляет очень интерактивный интерфейс, который позволяет пользователям создавать различные привлекательные статистические диаграммы. На основе matplotlib осуществляется инкапсуляция API более высокого уровня.

import seaborn as sns
String

import 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

Это очень мощная библиотека на питоне, например, при импорте модели можно сохранить много кода модели и напрямую закинуть в эту модель наши параметры. Например: NB.fit(X_train, y_train) может одновременно реализовать процесс подбора модели для разделения набора данных и разделения метки обучения в наборе для обучения.

V. Резюме

Как следует из названия, Pure Meng новое введение машинного обучения с нуля. Начните изучать машинное обучение с нуля в октябре, а время на изучение этой проблемы — один месяц. В этом месяце я надолго застрял на ранней стадии, научился устанавливать различные необходимые библиотеки python с помощью командной строки cmd, последний процесс был немного быстрее. На протяжении всего процесса анализ данных (прогнозирование тренда, анализ веса, возможное удаление и очистка данных и т. д.) может использоваться для выбора подходящих функций для обучения модели и реализации прогнозирования неполных данных. На самом деле эта модель не очень хороша, и точность может быть улучшена в слишком многих местах.Например, при разделении функций функции могут быть уточнены в соответствии с количеством различных временных интервалов, а разработка функций может достичь более высокая точность и уменьшить значение логарифмических потерь. В общем, весь процесс обработки не идеален, и обязательно будет много лазеек и возможностей для улучшения.Этот опыт можно рассматривать как новую возможность обучения для себя, поэтому давайте накапливать опыт с нуля.