Python项目实战-----科比数据集分析
生活随笔
收集整理的這篇文章主要介紹了
Python项目实战-----科比数据集分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一 案例分析
- 在給定科比職業(yè)生涯的相關(guān)數(shù)據(jù),比如投籃命中率、投籃出手次數(shù)等特征進行分析,投出一球是否命中。本質(zhì)上也為二分類問題,此次選用隨機森林作為模型訓(xùn)練算法。
數(shù)據(jù)集及完整代碼地址https://github.com/RenDong3/Python_Note
二 特征工程
1 讀取數(shù)據(jù)
- 1.1基本屬性 如head()、tail()、shape、columns
- 1.2特征聯(lián)系
- loc_x、lox_y表示球場的經(jīng)緯度 可以理解為位置,所以選用散點圖可以看出整體表現(xiàn)為球場形狀
2 特征工程
2.1 去除無效特征
- 一般對于ID、time等這些無關(guān)緊要的特征可以直接丟棄
- axis的重點在于方向,而不是行和列
- 當(dāng)axis=1時,數(shù)組的變化是橫向的,而體現(xiàn)出來的是列的增加或者減少
- 如果是拼接,那么也是左右橫向拼接;如果是drop,那么也是橫向發(fā)生變化,體現(xiàn)為列的減少。
2.2 缺失值處理
- 丟棄dropna()
- 對于缺失數(shù)據(jù)較多的特征可以選擇直接丟棄特征,缺失數(shù)據(jù)較少的特征可以只丟棄缺失值
- 填充fillna()
- 一般選擇特征的未缺失值的均值進行缺失值的填充
2.3 特征組合
- 如這里可以將小時和分鐘進行結(jié)合作為新的特征
2.4 相似特征保一
- 繪制散點圖描述特征相關(guān)性,相關(guān)程度較高的特征保留一個即可
- 如本例中dist特征和shot_distance特征具有很高的正相關(guān),屬于相似特征
2.5 特征類型轉(zhuǎn)換
- 字符型轉(zhuǎn)為數(shù)值型
- one-hot編碼
- 一個長度為n的數(shù)組,只有一個元素是1.0,其他元素是0.0。
- 自定義字典調(diào)用replace
- 去除特定字符
- 如’ % ‘、’ - '等特殊連接符號
三 模型訓(xùn)練
1 隨機森林
1.1 原理
- 隨機森林由Leo Breiman(2001)提出的一種分類算法,它通過自助法(bootstrap)重采樣技術(shù),從原始訓(xùn)練樣本集N中有放回地重復(fù)隨機抽取n個樣本生成新的訓(xùn)練樣本集合訓(xùn)練決策樹,然后按以上步驟生成m棵決策樹組成隨機森林,新數(shù)據(jù)的分類結(jié)果按分類樹投票多少形成的分數(shù)而定。其實質(zhì)是對決策樹算法的一種改進,將多個決策樹合并在一起,每棵樹的建立依賴于獨立抽取的樣本。
- 單棵樹的分類能力可能很小,但在隨機產(chǎn)生大量的決策樹后,一個測試樣本可以通過每一棵樹的分類結(jié)果經(jīng)統(tǒng)計后選擇最可能的分類。
1.2 流程
- 從樣本集中有放回隨機采樣選出n個樣本
- 從所有特征中隨機選擇k個特征,對選出的樣本利用這些特征建立決策樹(一般是CART,也可是別的或混合)
- 重復(fù)以上兩步m次,即生成m棵決策樹,形成隨機森林
- 對于新數(shù)據(jù),經(jīng)過每棵樹決策,最后投票確認分到哪一類
1.3 優(yōu)點
- 每棵樹都選擇部分樣本及部分特征,一定程度避免過擬合
- 每棵樹隨機選擇樣本并隨機選擇特征,使得具有很好的抗噪能力,性能穩(wěn)定
- 能處理很高維度的數(shù)據(jù),并且不用做特征選擇
- 適合并行計算
- 實現(xiàn)比較簡單
1.4 缺點
- 參數(shù)較復(fù)雜
- 模型訓(xùn)練和預(yù)測都比較慢
2 參數(shù)調(diào)優(yōu)
2.1 參數(shù)詳解
對于隨機森林存在很多參數(shù),但是用的比較多的一般為下面幾個:
- n_estimators:
- 在利用最大投票數(shù)或平均值來預(yù)測之前,你想要建立子樹的數(shù)量。 較多的子樹可以讓模型有更好的性能,但同時讓你的代碼變慢。 你應(yīng)該選擇盡可能高的值,只要你的處理器能夠承受的住,因為這使你的預(yù)測更好更穩(wěn)定。
- max_depth:
- 決策樹最大深度,默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。
- 一般來說,數(shù)據(jù)少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于數(shù)據(jù)的分布。
- 常用的可以取值10-100之間。
- min_samples_leaf:
- 葉子節(jié)點最少樣本數(shù),這個值限制了葉子節(jié)點最少的樣本數(shù),如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝。
- 默認是1,可以輸入最少的樣本數(shù)的整數(shù),或者最少樣本數(shù)占樣本總數(shù)的百分比。如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值。
- min_samples_split:
- 內(nèi)部節(jié)點再劃分所需最小樣本數(shù), 這個值限制了子樹繼續(xù)劃分的條件,如果某節(jié)點的樣本數(shù)少于min_samples_split,則不會繼續(xù)再嘗試選擇最優(yōu)特征來進行劃分。
- 默認是2.如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值。
代碼演示
# find the best n_estimators for RandomForestClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.cross_validation import KFoldprint('Finding best n_estimators for RandomForestClassifier...') min_score = 100000 best_n = 0 scores_n = [] range_n = np.logspace(0,2,num=3).astype(int) for n in range_n:print("the number of trees : {0}".format(n))t1 = time.time()rfc_score = 0.rfc = RandomForestClassifier(n_estimators=n)for train_k, test_k in KFold(len(train_kobe), n_folds=10, shuffle=True):rfc.fit(train_kobe.iloc[train_k], train_label.iloc[train_k])#rfc_score += rfc.score(train.iloc[test_k], train_y.iloc[test_k])/10pred = rfc.predict(train_kobe.iloc[test_k])rfc_score += log_loss(train_label.iloc[test_k], pred) / 10scores_n.append(rfc_score)if rfc_score < min_score:min_score = rfc_scorebest_n = nt2 = time.time()print('Done processing {0} trees ({1:.3f}sec)'.format(n, t2-t1)) print(best_n, min_score)# find best max_depth for RandomForestClassifier print('Finding best max_depth for RandomForestClassifier...') min_score = 100000 best_m = 0 scores_m = [] range_m = np.logspace(0,2,num=3).astype(int) for m in range_m:print("the max depth : {0}".format(m))t1 = time.time()rfc_score = 0.rfc = RandomForestClassifier(max_depth=m, n_estimators=best_n)for train_k, test_k in KFold(len(train_kobe), n_folds=10, shuffle=True):rfc.fit(train_kobe.iloc[train_k], train_label.iloc[train_k])#rfc_score += rfc.score(train.iloc[test_k], train_y.iloc[test_k])/10pred = rfc.predict(train_kobe.iloc[test_k])rfc_score += log_loss(train_label.iloc[test_k], pred) / 10scores_m.append(rfc_score)if rfc_score < min_score:min_score = rfc_scorebest_m = mt2 = time.time()print('Done processing {0} trees ({1:.3f}sec)'.format(m, t2-t1)) print(best_m, min_score)結(jié)果:
四 總結(jié)
Reference
隨機森林(原理/樣例實現(xiàn)/參數(shù)調(diào)優(yōu))
總結(jié)
以上是生活随笔為你收集整理的Python项目实战-----科比数据集分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQl 作业方面(转)
- 下一篇: python bool值要注意的一些地方