code_demo 用隨機森林做缺失值預測


直接上代碼

在做特征工程的時候, 其實可以用算法來處理特征工程的, 比如缺失值填充之類的. 這里一段code_demo是搬運來的, 不過是真滴好用呢.

# RandomForest - 強化, 對 new_user_class_level 進行 缺失值預測


from pyspark.mllib.regression import LabeledPoint

# 1. 過濾出 new_user_class_level 非空的df 作為 訓練集

train_data2 = user_profile_df.dropna(subset=["new_user_class_level"]).rdd.map(
    lambda r:LabeledPoint(r.new_user_class_level - 1, [r.cms_segid, r.cms_group_id, r.final_gender_code, r.age_level, r.shopping_level, r.occupation])
)

# 2. 訓練模型

from pyspark.mllib.tree import RandomForest

model2 = RandomForest.trainClassifier(train_data2, 4, {}, 5)

# 3. 測試 一波
model2.predict([0.0, 4.0 ,2.0 , 4.0, 1.0, 0.0])

# 預測值實際應該為2
# 4. 對缺失值進行預測
na_df = user_profile_df.na.fill(-1).where("new_user_class_level=-1")

def row(r):
    return r.cms_segid, r.cms_group_id, r.final_gender_code, r.age_level, r.shopping_level, r.occupation

# 5. rdd方式進行行處理
rdd2 = na_df.rdd.map(row)

# 6. 利用模型預測
predicts = model2.predict(rdd2)

# 7. 修正預測值(+1), 並合並 df 

tmp = predicts.map(lambda x:int(x)).collect()

pdf = pl_na_df.toPandas()

import numpy as np

pdf['new_user_class_level'] = np.array(tmp)+1

# 和預測df 和 真實 df 進行 unionAll
new_user_profile_df = user_profile_df.dropna(subset=["new_user_class_level"]).unionAll(
spark.createDataFrame(tmp, schema=schema))

# 注意: unionAll的使用(縱向合並df), 兩個df的表結構必須完全一樣
new_user_profile_df.show(5)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM