机器学习
一般来说,一个学习问题通常会考虑一系列 n 个 样本 数据,然后尝试预测未知数据的属性。 如果每个样本是 多个属性的数据,比如说是一个多维记录),就说它有许多“属性”,或称 features(特征) 。
我们可以将学习问题分为几大类:
- [监督学习]其中数据带有一个附加属性,即我们想要预测的结果值。这个问题可以是:
> [分类]: 样本属于两个或更多个类,我们想从已经标记的数据中学习如何预测未标记数据的类别。 分类问题的一个例子是手写数字识别,其目的是将每个输入向量分配给有限数目的离散类别之一。 我们通常把分类视作监督学习的一个离散形式(区别于连续形式),从有限的类别中,给每个样本贴上正确的标签。 > [回归]: 如果期望的输出由一个或多个连续变量组成,则该任务称为 *回归* 。 回归问题的一个例子是预测鲑鱼的长度是其年龄和体重的函数。
- [无监督学习]其中训练数据由没有任何相应目标值的一组输入向量x组成。这种问题的目标可能是在数据中发现彼此类似的示例所聚成的组,这种问题称为 [聚类], 或者,确定输入空间内的数据分布,称为 [密度估计],又或从高维数据投影数据空间缩小到二维或三维以进行 可视化 。
训练集和测试集
机器学习是从数据的属性中学习,并将它们应用到新数据的过程。 这就是为什么机器学习中评估算法的普遍实践是把数据分割成 训练集 (我们从中学习数据的属性)和 测试集 (我们测试这些性质)。
机器学习实战
-
第一步:加载相应包和所需的数据集
我们这里选的是sklearn包,此包是python中比较常用的机器学习集成包,可以满足大多数模型需求。
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 18 13:43:44 2018
@author: Administrator
"""
% reset -f
% clear
# In[*]
##########第一步 导入包和数据
# In[*]
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
from sklearn import metrics
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import os
os.chdir("C:\\Users\\Administrator\\Desktop\\all")
# In[*]
train = pd.read_csv('train.csv',header = 0,index_col=0)
test = pd.read_csv('test.csv',header = 0,index_col=0)
# In[*]
sns.distplot(train["SalePrice"])
plt.show()
我们可以看到训练集train的房屋售价分布相对均匀
-
第二步 删减和目标变量低相关的属性
# In[*]
##########第二步 删减和目标变量低相关的属性
# In[*]
data = train.corr()
sns.heatmap(data)
plt.show()
# In[*]
data = train.corr()
data["SalePrice"].sort_values()
KitchenAbvGr -0.135907
EnclosedPorch -0.128578
MSSubClass -0.084284
OverallCond -0.077856
YrSold -0.028923
LowQualFinSF -0.025606
MiscVal -0.021190
BsmtHalfBath -0.016844
BsmtFinSF2 -0.011378
3SsnPorch 0.044584
MoSold 0.046432
PoolArea 0.092404
ScreenPorch 0.111447
BedroomAbvGr 0.168213
BsmtUnfSF 0.214479
BsmtFullBath 0.227122
LotArea 0.263843
HalfBath 0.284108
OpenPorchSF 0.315856
2ndFlrSF 0.319334
WoodDeckSF 0.324413
LotFrontage 0.351799
BsmtFinSF1 0.386420
Fireplaces 0.466929
MasVnrArea 0.477493
GarageYrBlt 0.486362
YearRemodAdd 0.507101
YearBuilt 0.522897
TotRmsAbvGrd 0.533723
FullBath 0.560664
1stFlrSF 0.605852
TotalBsmtSF 0.613581
GarageArea 0.623431
GarageCars 0.640409
GrLivArea 0.708624
OverallQual 0.790982
SalePrice 1.000000
Name: SalePrice, dtype: float64
该图为属性之间的相关系数,我们需要做的是删除掉与预测目标不相关或者低相关的变量。(一般来说我们同时也应该删除掉用来预测的变量之间高度相关的变量),所以我们删除了BsmtHalfBath,'BsmtFinSF2', '3SsnPorch', 'MoSold', 'PoolArea', 'ScreenPorch'这几个与预测目标低相关的变量。
# In[*]
train = train.drop(['BsmtHalfBath',
'BsmtFinSF2',
'3SsnPorch',
'MoSold',
'PoolArea',
'ScreenPorch',
'BedroomAbvGr'], axis=1)
test = test.drop(['BsmtHalfBath',
'BsmtFinSF2',
'3SsnPorch',
'MoSold',
'PoolArea',
'ScreenPorch',
'BedroomAbvGr'], axis=1)
我们来挑几个变量,看一下变量与目标的相关
# In[*]
sns.lmplot(x="OverallQual", y="SalePrice",
data=train,fit_reg=False,scatter=True)
plt.show()
# In[*]
sns.lmplot(x="TotalBsmtSF", y="SalePrice",
data=train,fit_reg=False,scatter=True)
plt.show()
-
第三步 删减和填充缺失值
# In[*]
##########第三步 删减和填充缺失值
# In[*]
# In[*]
for col in train.columns:
if train[col].isnull().sum() > 0:
print (col, train[col].isnull().sum())
# In[*]
train = train.drop(["MiscFeature", "PoolQC", "Alley",
"Fence",'FireplaceQu' ], axis=1)
test = test.drop(["MiscFeature", "PoolQC", "Alley",
"Fence",'FireplaceQu' ], axis=1)
# In[*]
print(train.describe())
# In[*]
all_data = pd.concat((train, test))
# In[*]
for col in train.columns:
if train[col].isnull().sum() > 0:
if train[col].dtypes == 'object':
val = all_data[col].dropna().value_counts().idxmax()
train[col] = train[col].fillna(val)
else:
val = all_data[col].dropna().mean()
train[col] = train[col].fillna(val)
# In[*]
for col in test.columns:
if test[col].isnull().sum() > 0:
if test[col].dtypes == 'object':
val = all_data[col].dropna().value_counts().idxmax()
test[col] = test[col].fillna(val)
else:
val = all_data[col].dropna().mean()
test[col] = test[col].fillna(val)
# In[*]
for col in all_data.select_dtypes(include = [object]).columns:
train[col] = train[col].astype('category',
categories = all_data[col].dropna().unique())
test[col] = test[col].astype('category',
categories = all_data[col].dropna().unique())
# In[*]
for col in train.columns:
if train[col].dtype.name == 'category':
tmp = pd.get_dummies(train[col], prefix = col)
train = train.join(tmp)
train = train.drop(col, axis=1)
# In[*]
for col in test.columns:
if test[col].dtype.name == 'category':
tmp = pd.get_dummies(test[col], prefix = col)
test = test.join(tmp)
test = test.drop(col, axis=1)
# In[*]
for col in train.columns:
if train[col].isnull().sum() > 0:
print (col, train[col].isnull().sum())
# In[*]
这一步的主要工作是删减和填充缺失值,首先是查看数据每一列缺失值的情况,我将其中缺失值大于一半观察值的属性删除掉。然后填充缺失值,填充的时候,数字型属性是用的中位值,而字符串类型的属性用的是最多的值
-
第四步 建立线性回归预测模型
# In[*]
##########第四步 建立线性回归预测模型
# In[*]
# In[*]
lr = linear_model.LinearRegression()
X = train.drop("SalePrice", axis=1)
y = np.log(train["SalePrice"])
score = cross_val_score(lr, X,y, scoring='mean_squared_error')
# In[*]
print(score)
# In[*]
lr = lr.fit(X, y)
results = lr.predict(test)
final = np.exp(results)
-
第五步 保存预测结果
# In[*]
##########第五步 保存预测结果
submission = pd.DataFrame()
submission['Id'] = test.index
submission['SalePrice'] = final
submission.to_csv("submission1.csv", index= False)