---
# System prepended metadata

title: Prediction of Milk yield of Taiwan Ranches
tags: [Time sereis, XGboost, Project, Competition]

---

###### tags: `Project` `Competition`

Prediction of Milk yield of Taiwan Ranches
===

Comp. info https://aidea-web.tw/topic/a7cead35-c5ee-460d-b5cc-b92b46739fff?lang=zh

本議題透過中華民國乳業協會所提供的乳牛群性能改良計畫（Dairy Herd Improvement, DHI）資料庫預測台灣不同地區牧場生產的乳量，希望參賽者能掌握預測乳量生產的關鍵，並對於台灣酪農後續在智慧化牧場管理與乳價擬定能有相當程度的助益。

Date: 2019/10/01~2019/12/18

評估標準:
參與本議題研究者在提供預測結果後，系統後台將根據評估方式計算分數，評估方式採用計算與實際值的均根差 (Root-Mean-Square Error, RMSE)，公式如下

![Uploading file..._9mmj69ix2]()


四種檔案類型:
1. 檢測報告(檔案名稱：report.csv)
2. 分娩資料(檔案名稱：birth.csv)
3. 配種紀錄(檔案名稱：breed.csv)
4. 健康狀況(spec.csv)

加入外部資料:
https://e-service.cwb.gov.tw/HistoryDataQuery/

![](https://i.imgur.com/VwEUOgq.png)


# 1. Check raw data:
1. Raw data 沒有 column name，先將 DataFrame 加上 column name。
2. Check data type:將欄位轉換為所需要的格式。
    1. "乳牛編號","父親牛精液編號","母親乳牛編號","最後配種精液","第一次配種精液" => str。
    2. "出生日期","最近分娩日期","採樣日期","檢測日期","最後配種日期","前次分娩日期","第一次配種日期" => datetime。
    3. "Temperature","Precp","PrecpDay" => float

## 1.2 check data

### 1.2.1 Report:
    
檢查的 null 數量
![](https://i.imgur.com/9O50345.png)

檢查連續型 feature
![](https://i.imgur.com/9UadJuQ.png)

看一下離散型資料的數量
![](https://i.imgur.com/04nLbxV.png)

### 1.2.2 Spec:

檢查的 null 數量
![](https://i.imgur.com/T4Nh16K.png)

看一下離散型資料的數量
![](https://i.imgur.com/942QKZV.png)


# 2. Draw

看一下乳量與 feature 的分布
![](https://i.imgur.com/G20sVCd.png)

看一下乳量跟天氣 feature 的關係
![](https://i.imgur.com/51TmzSG.png)

看一下離散型資料的分布
![](https://i.imgur.com/j7KHoaM.png)

# 3. ETL

## 3.1 One-hot encoding

把資料 年、月、農場 轉換成 one-hot encoding
![](https://i.imgur.com/3ioyDEB.png)

## 3.2 Grouping Categorial data
將 "資料月份","酪農場代號","乳牛編號","父親牛精液編號","母親乳牛編號","最後配種精液","第一次配種精液" 做 Grouping

## 3.3 Impute data

### 3.3.1 Report:
用以下特徵當作 X
胎次、月齡、月份、農場、乳牛編號平均乳量
透過 fancyimpute.IterativeImputer 對乳量與泌乳天數進行補值

### 3.3.2 Spec:
針對狀況類別進行補值與清洗

``` python
Spec_df.loc[(Spec_df["狀況類別"] == "n"),["狀況類別"]] = "N"
Spec_df.loc[(Spec_df["狀況類別"] == "c"),["狀況類別"]] = "C"
Spec_df.loc[(Spec_df["狀況類別"] == "1"),["狀況類別"]] = "C"
Spec_df.loc[(Spec_df["狀況類別"] == "2"),["狀況類別"]] = "C"

Spec_df.loc[(Spec_df["狀況代號"].isnull()),["狀況代號"]] = "N"
```


# 4. select feature

## 4.1 OLS

將連續資料規準化後做 OLS
![](https://i.imgur.com/Hs5peni.png)

## 4.2 PCS
看 feature 在變數空間的解釋力

![](https://i.imgur.com/NYNXQ2M.png)
![](https://i.imgur.com/w5hT81J.png)

# 5. Modeling

把 Report 跟 Spec 的資料 merge 起來

``` python
Report_df = pd.merge(Report_df,Spec_df[["乳牛編號","狀況類別","狀況代號","狀況日期","備註","登錄日期"]],how = "left",on = "乳牛編號")
```

## 5.1 Grid search

``` python
other_params = {'eta': 0.3,'n_estimators': 150,"learning_rate": 0.1, 'gamma': 0, 'max_depth': 5, 'min_child_weight': 1, "objective":'reg:linear',
                'colsample_bytree': 0.7, 'colsample_bylevel': 1, 'subsample': 0.85, 'reg_lambda': 1, 'reg_alpha': 0, "max_delta_step":0 ,"nthread":-1,
                'seed': 1440,"scale_pos_weight":1}

cv_params = {'n_estimators': [50,100,150,200,250],'eta': [0.3,0.5,0.7],'max_depth': [3,5,7], 'min_child_weight': [1,2,3]}
regress_model = XGBRegressor(**other_params)  # 注意这里的两个 * 号！
gs = GridSearchCV(regress_model, cv_params, verbose=2, refit=True, cv=kfold, n_jobs=-1, scoring="neg_mean_squared_error")
gs.fit(X, y)  # X为训练数据的特征值，y为训练数据的label
# 性能测评
print("参数的最佳取值：:", gs.best_params_)
print("最佳模型得分:", gs.best_score_)
```

![](https://i.imgur.com/L0nelYg.png)

## 5.2 特徵表現
![](https://i.imgur.com/Z0qyoZv.png)

### 5.3 Result:
![](https://i.imgur.com/rc1q4ES.png)

###### tags: `Time sereis` `XGboost`
