Python機(jī)器學(xué)習(xí)初步——第二部分

# coding = UTF-8

# ++++++++++++++++++++++++++++++++++++++++++++++++++++
# machine_five_ldmwp.py
# @簡介:用python進(jìn)行機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘
# @作者:Glen
# @日期:2016.8.16
# @資料來源:Python數(shù)據(jù)挖掘入門與實(shí)踐
# +++++++++++++++++++++++++++++++++++++++++++++++++++++

import numpy as np
import pandas as pd
from scipy.stats import pearsonr
from sklearn.feature_selection import VarianceThreshold
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import cross_val_score
from sklearn.base import TransformerMixin
from sklearn.utils import as_float_array
from sklearn.pipeline import Pipeline

# ---------------------------------------
# 用轉(zhuǎn)換器抽取特征
# ----------------------------------------

# 模型就是用來簡化世界期吓,特征抽取也是一樣。
# 降低復(fù)雜性有好處倾芝,但也有不足讨勤,簡化會(huì)忽略很多細(xì)節(jié)。

# 這里的例子用adult數(shù)據(jù)集晨另,預(yù)測一個(gè)人是否年收入多于五萬美元

# 1. 載入數(shù)據(jù)
adult_filename = r'E:\data\bigdata\adult\adult.data'
adult = pd.read_csv(adult_filename, header=None, names=["Age", "Work-Class", "fnlwgt", "Education",
                                                        "Education-Num", "Marital-Status", "Occupation",
                                                        "Relationship", "Race", "Sex", "Capital-gain",
                                                        "Capital-loss", "Hours-per-week", "Native-Country",
                                                        "Earnings-Raw"])

# 2. 數(shù)據(jù)清理
# 刪除缺失數(shù)據(jù)
adult.dropna(how='all', inplace=True)

# 3. 探索性數(shù)據(jù)分析
# 描述統(tǒng)計(jì)
print(adult["Hours-per-week"].describe())

print(adult["Work-Class"].unique())

# 3'. 演示scikit-learn特征選擇的方式
X = np.arange(30).reshape((10, 3))
X[:,1] = 1
# 注意:這時(shí)X矩陣中第二列全為1

# 利用VarianceThreshold()來刪除方差低于閾值的變量
vt = VarianceThreshold()
Xt = vt.fit_transform(X)
# 這個(gè)時(shí)候潭千,第二列就被刪除了,因?yàn)樗姆讲顬榱?print(vt.variances_)

# 回到adult的例子借尿,選擇最佳特征
X = adult[["Age", "Education-Num", "Capital-gain", "Capital-loss", "Hours-per-week"]].values
y = (adult["Earnings-Raw"] == ' >50K').values

# 構(gòu)建選擇器
transformer = SelectKBest(score_func=chi2, k=3)
Xt_chi2 = transformer.fit_transform(X, y)

# 結(jié)論:相關(guān)性最好的分別是第一刨晴、三屉来、四列
print(transformer.scores_)

# 還可以利用皮爾遜(Pearson)相關(guān)系數(shù)進(jìn)行選擇
# 這里利用了SciPy庫的pearsonr()函數(shù)

# 定義函數(shù)
def multivariate_pearsonr(X, y):
    scores, pvalues = [], []
    for column in range(X.shape[1]):
        cur_score, cur_p = pearsonr(X[:,column], y)
        scores.append(abs(cur_score))
        pvalues.append(cur_p)
    return (np.array(scores), np.array(pvalues))

transformer = SelectKBest(score_func=multivariate_pearsonr, k=3)
Xt_pearson = transformer.fit_transform(X, y)
print(transformer.scores_)

# 利用CART分類器,查看特征選擇的準(zhǔn)確率
clf = DecisionTreeClassifier(random_state=14)
scores_chi2 = cross_val_score(clf, Xt_chi2, y, scoring='accuracy')
scores_pearson = cross_val_score(clf, Xt_pearson, y, scoring='accuracy')

print("Chi2 performance: {0:.3f}".format(scores_chi2.mean()))
print("Pearson performance: {0:.3f}".format(scores_pearson.mean()))

# 創(chuàng)建自己的轉(zhuǎn)換器
# 轉(zhuǎn)換器的API很簡單狈癞。它接受一種特定格式的數(shù)據(jù)茄靠,輸出一種格式的數(shù)據(jù)。

# 轉(zhuǎn)換器有兩個(gè)關(guān)鍵函數(shù)
# - fit(): 接受訓(xùn)練數(shù)據(jù)蝶桶,設(shè)置內(nèi)部參數(shù)
# - transform(): 轉(zhuǎn)換過程慨绳。接受訓(xùn)練數(shù)據(jù)集或相同格式的新數(shù)據(jù)集。

# 轉(zhuǎn)換器范例
class MeanDiscrete(TransformerMixin):
    def fit(self, X, y=None):
        X = as_float_array(X)
        self.mean = np.mean(X, axis=0)
        return self

    def transform(self, X):
        X = as_float_array(X)
        assert X.shape[1] == self.mean.shape[0]
        return X > self.mean

pipeline = Pipeline([('mean_discrete', MeanDiscrete()),
                     ('classifier', DecisionTreeClassifier(random_state=14))])
scores_mean_discrete = cross_val_score(pipeline, X, y, scoring='accuracy')
print("Mean Discrete performance: {0:.3f}".format(scores_mean_discrete.mean()))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尖阔,更是在濱河造成了極大的恐慌,老刑警劉巖战秋,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讨韭,居然都是意外死亡获询,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門拐袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梢薪,你說我怎么就攤上這事蹬铺。” “怎么了秉撇?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵甜攀,是天一觀的道長。 經(jīng)常有香客問我琐馆,道長规阀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任瘦麸,我火速辦了婚禮谁撼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滋饲。我一直安慰自己厉碟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布屠缭。 她就那樣靜靜地躺著箍鼓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呵曹。 梳的紋絲不亂的頭發(fā)上款咖,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天何暮,我揣著相機(jī)與錄音,去河邊找鬼铐殃。 笑死海洼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的背稼。 我是一名探鬼主播贰军,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟹肘!你這毒婦竟也來了词疼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帘腹,失蹤者是張志新(化名)和其女友劉穎贰盗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳欲,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舵盈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了球化。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽晚。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筒愚,靈堂內(nèi)的尸體忽然破棺而出赴蝇,到底是詐尸還是另有隱情,我是刑警寧澤巢掺,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布句伶,位于F島的核電站,受9級特大地震影響陆淀,放射性物質(zhì)發(fā)生泄漏考余。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一轧苫、第九天 我趴在偏房一處隱蔽的房頂上張望楚堤。 院中可真熱鬧,春花似錦含懊、人聲如沸钾军。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吏恭。三九已至,卻和暖如春重罪,著一層夾襖步出監(jiān)牢的瞬間樱哼,已是汗流浹背哀九。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搅幅,地道東北人阅束。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像茄唐,于是被迫代替她去往敵國和親息裸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容