TranslateProject/published/201610/team_test/part 6 - Building a data science portfolio - Machine learning project.md

151 lines
6.0 KiB
Markdown
Raw Normal View History

### 做出预测
既然完成了前期准备,我们可以开始准备做出预测了。我将创建一个名为 predict.py 的新文件,它会使用我们在最后一步创建的 train.csv 文件。下面的代码:
- 导入所需的库
- 创建一个名为 `cross_validate` 的函数:
- 使用正确的关键词参数创建逻辑回归分类器logistic regression classifier
- 创建移除了 `id``foreclosure_status` 属性的用于训练模型的列
-`train` 数据帧使用交叉验证
- 返回预测结果
```python
import os
import settings
import pandas as pd
from sklearn import cross_validation
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
def cross_validate(train):
clf = LogisticRegression(random_state=1, class_weight="balanced")
predictors = train.columns.tolist()
predictors = [p for p in predictors if p not in settings.NON_PREDICTORS]
predictions = cross_validation.cross_val_predict(clf, train[predictors], train[settings.TARGET], cv=settings.CV_FOLDS)
return predictions
```
### 预测误差
现在,我们仅仅需要写一些函数来计算误差。下面的代码:
- 创建函数 `compute_error`
- 使用 scikit-learn 计算一个简单的精确分数(与实际 `foreclosure_status` 值匹配的预测百分比)
- 创建函数 `compute_false_negatives`
- 为了方便,将目标和预测结果合并到一个数据帧
- 查找漏报率
- 找到原本应被预测模型取消但没有取消的贷款数目
- 除以没被取消的贷款总数目
```python
def compute_error(target, predictions):
return metrics.accuracy_score(target, predictions)
def compute_false_negatives(target, predictions):
df = pd.DataFrame({"target": target, "predictions": predictions})
return df[(df["target"] == 1) & (df["predictions"] == 0)].shape[0] / (df[(df["target"] == 1)].shape[0] + 1)
def compute_false_positives(target, predictions):
df = pd.DataFrame({"target": target, "predictions": predictions})
return df[(df["target"] == 0) & (df["predictions"] == 1)].shape[0] / (df[(df["target"] == 0)].shape[0] + 1)
```
### 聚合到一起
现在,我们可以把函数都放在 `predict.py`。下面的代码:
- 读取数据集
- 计算交叉验证预测
- 计算上面的 3 个误差
- 打印误差
```python
def read():
train = pd.read_csv(os.path.join(settings.PROCESSED_DIR, "train.csv"))
return train
if __name__ == "__main__":
train = read()
predictions = cross_validate(train)
error = compute_error(train[settings.TARGET], predictions)
fn = compute_false_negatives(train[settings.TARGET], predictions)
fp = compute_false_positives(train[settings.TARGET], predictions)
print("Accuracy Score: {}".format(error))
print("False Negatives: {}".format(fn))
print("False Positives: {}".format(fp))
```
一旦你添加完代码,你可以运行 `python predict.py` 来产生预测结果。运行结果向我们展示漏报率为 `.26`,这意味着我们没能预测 `26%` 的取消贷款。这是一个好的开始,但仍有很多改善的地方!
你可以在[这里][41]找到完整的 `predict.py` 文件
你的文件树现在看起来像下面这样:
```
loan-prediction
├── data
│ ├── Acquisition_2012Q1.txt
│ ├── Acquisition_2012Q2.txt
│ ├── Performance_2012Q1.txt
│ ├── Performance_2012Q2.txt
│ └── ...
├── processed
│ ├── Acquisition.txt
│ ├── Performance.txt
│ ├── train.csv
├── .gitignore
├── annotate.py
├── assemble.py
├── predict.py
├── README.md
├── requirements.txt
├── settings.py
```
### 撰写 README
既然我们完成了端到端的项目,那么我们可以撰写 README.md 文件了,这样其他人便可以知道我们做的事,以及如何复制它。一个项目典型的 README.md 应该包括这些部分:
- 一个高水准的项目概览,并介绍项目目的
- 任何必需的数据和材料的下载地址
- 安装命令
- 如何安装要求依赖
- 使用命令
- 如何运行项目
- 每一步之后会看到的结果
- 如何为这个项目作贡献
- 扩展项目的下一步计划
[这里][42] 是这个项目的一个 README.md 样例。
### 下一步
恭喜你完成了端到端的机器学习项目!你可以在[这里][43]找到一个完整的示例项目。一旦你完成了项目,把它上传到 [Github][44] 是一个不错的主意,这样其他人也可以看到你的文件夹的部分项目。
这里仍有一些留待探索数据的角度。总的来说,我们可以把它们分割为 3 类 - 扩展这个项目并使它更加精确,发现预测其他列并探索数据。这是其中一些想法:
-`annotate.py` 中生成更多的特性
- 切换 `predict.py` 中的算法
- 尝试使用比我们发表在这里的更多的来自 `Fannie Mae` 的数据
- 添加对未来数据进行预测的方法。如果我们添加更多数据,我们所写的代码仍然可以起作用,这样我们可以添加更多过去和未来的数据。
- 尝试看看是否你能预测一个银行是否应该发放贷款(相对地,`Fannie Mae` 是否应该获得贷款)
- 移除 train 中银行不知道发放贷款的时间的任何列
- 当 Fannie Mae 购买贷款时,一些列是已知的,但不是之前
- 做出预测
- 探索是否你可以预测除了 foreclosure_status 的其他列
- 你可以预测在销售时财产值多少?
- 探索探索性能更新之间的细微差别
- 你能否预测借款人会逾期还款多少次?
- 你能否标出的典型贷款周期?
- 标出一个州到州或邮政编码到邮政级水平的数据
- 你看到一些有趣的模式了吗?
如果你建立了任何有趣的东西,请在评论中让我们知道!
如果你喜欢这个,你可能会喜欢阅读 Build a Data Science Porfolio 系列的其他文章:
- [Storytelling with data][45].
- [How to setup up a data science blog][46].