Kaggle、Python机器学习教程(三):建立第一个机器学习模型
选择建模数据
您的数据集有太多的变量,以至于您无法理解,甚至无法很好地打印出来。如何将如此庞大的数据压缩到您能够理解的程度?
我们先用直觉选择几个变量。稍后的课程将向您展示自动对变量进行优先排序的统计技术。
要选择变量/列,我们需要看到数据集中所有列的列表。这是通过DataFrame的columns属性完成的。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import pandas as pd
# 将文件路径保存到变量以便于访问
melbourne_file_path = 'melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
print(melbourne_data.columns)
输出:
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
'Longtitude', 'Regionname', 'Propertycount'],
dtype='object')
# 墨尔本的数据有一些缺失的值(有些房子没有记录一些变量)。
# 我们将在后面的教程中学习如何处理缺失的值。
# 您的Iowa数据在您使用的列中没有缺失的值。
# 所以现在我们将采用最简单的方法,从数据中删除有空值的房屋。
# 现在不要太担心这个,尽管代码是:
# dropna删除丢失的值(认为na是“不可用的”)
# 通常情况下删除行,使用参数axis = 0,删除列的参数axis = 1,通常不会这么做,那样会删除一个变量。
melbourne_data = melbourne_data.dropna(axis=0)
有许多方法可以选择数据的子集。pandas微课程将更深入地介绍这些内容,但目前我们将重点介绍两种方法。
- 点符号,用来选择"预测目标"
- 选择列表中的一列,我们用它来作为“特性”
选择预测目标
您可以使用点符号来提取变量。 这一列存储在一个Series中,它大致类似于只有一列数据的DataFrame。
我们将使用点符号来选择我们想要预测的列,这称为预测目标。 按照惯例,预测目标称为y。 因此,我们需要在墨尔本数据中保存房价的代码是:
y = melbourne_data.Price
选择特征
输入到我们模型中的列(后来用于进行预测)被称为“特征”。 在我们的例子中,那些将是用于确定房价的列。 有时,您将使用除目标之外的所有列作为要素。
目前,我们将构建一个只有少数功能的模型。 稍后您将看到如何迭代和比较使用不同功能构建的模型。
我们通过在括号内提供列名列表来选择多个功能。 该列表中的每个项目都应该是一个字符串(带引号)。
举例:
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
按照惯例,这个数据称为X.
X = melbourne_data[melbourne_features]
让我们使用describe方法和head方法快速查看我们将用于预测房价的数据,该方法显示前几行。
print(X.describe())
输出:
print(X.head())
输出:
使用这些命令目视检查数据是数据科学家工作的重要组成部分。 您经常会在数据集中发现值得进一步检查的惊喜。
建立你的模型
您将使用scikit-learn库来创建模型。 Scikit-learn是最常用的库,通常用于对存储在DataFrame中的数据类型进行建模。
构建和使用模型的步骤如下:
- 定义:它将是什么类型的模型? 决策树? 其他一些型号? 还指定了模型类型的一些其他参数。
- 调试:从提供的数据中捕获模式。 这是建模的核心。
- 预测:预计是什么样的
- 评估:确定模型预测的准确程度。
下面是使用scikit-learn定义决策树模型并将其与特征和目标变量拟合的示例。
# 导入scikit-learn库
from sklearn.tree import DecisionTreeRegressor
# 定义模型。 为random_state指定一个数字,以确保每次运行的结果相同
melbourne_model = DecisionTreeRegressor(random_state=1)
# 调试 model
melbourne_model.fit(X, y)
输出:
DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=1, splitter='best')
许多机器学习模型允许模型训练中的一些随机性。 为random_state指定一个数字可确保您在每次运行中获得相同的结果。 这被认为是一种很好的做法。 您使用任何数字,模型质量不会有意义地取决于您选择的确切值。
我们现在有一个可以用来进行预测的拟合模型。
在实践中,你会想要预测市场上的新房,而不是我们已经有价格的房屋。 但是我们将对训练数据的前几行进行预测,以了解预测函数的工作原理。
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
输出:
Making predictions for the following 5 houses:
Rooms Bathroom Landsize Lattitude Longtitude
1 2 1.0 156.0 -37.8079 144.9934
2 3 2.0 134.0 -37.8093 144.9944
4 4 1.0 120.0 -37.8072 144.9941
6 3 2.0 245.0 -37.8024 144.9993
7 2 1.0 256.0 -37.8060 144.9954
The predictions are
[1035000. 1465000. 1600000. 1876000. 1636000.]
全部代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
# 将文件路径保存到变量以便于访问
melbourne_file_path = 'melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# print(melbourne_data.columns)
# 墨尔本的数据有一些缺失的值(有些房子没有记录一些变量)。
# 我们将在后面的教程中学习如何处理缺失的值。
# 您的Iowa数据在您使用的列中没有缺失的值。
# 所以现在我们将采用最简单的方法,从数据中删除有空值的房屋。
# 现在不要太担心这个,尽管代码是:
# dropna删除丢失的值(认为na是“不可用的”)
# 通常情况下删除行,使用参数axis = 0,删除列的参数axis = 1,通常不会这么做,那样会删除一个变量。
melbourne_data = melbourne_data.dropna(axis=0)
y = melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]
# print(X.describe())
# print(X.head())
# 定义模型。 为random_state指定一个数字,以确保每次运行的结果相同
melbourne_model = DecisionTreeRegressor(random_state=1)
# 调试 model
print(melbourne_model.fit(X, y))
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))