python predictabel_统计学习方法的python实现
########################################################
#5.1 邏輯斯蒂回歸實(shí)現(xiàn)
#原理:構(gòu)造分類模型使得當(dāng)前的數(shù)據(jù)集出現(xiàn)的可能性最大-》最大似然法
########################################################
def logit_regression():
import pandas as pd# pandas 的教程:http://blog.csdn.net/overstack/article/details/9001565
import statsmodels.api as sm
import pylab as pl
import numpy as np
#步驟1:read the data in
df = pd.read_csv("http://www.ats.ucla.edu/stat/data/binary.csv")
# take a look at the dataset
print (df.head())#最上面的幾列,也有df.tail(3)
# admit gre gpa rank
# 0 0 380 3.61 3
# 1 1 660 3.67 3
# 2 1 800 4.00 1
# 3 1 640 3.19 4
# 4 0 520 2.93 4
# rename the 'rank' column because there is also a DataFrame method called 'rank'
df.columns = ["admit", "gre", "gpa", "prestige"]
print (df.columns)
# array([admit, gre, gpa, prestige], dtype=object)
##步驟2:得到數(shù)據(jù)的基本統(tǒng)計(jì)信息
# summarize the data
print (df.describe())
# admit gre gpa prestige
# count 400.000000 400.000000 400.000000 400.00000
# mean 0.317500 587.700000 3.389900 2.48500
# std 0.466087 115.516536 0.380567 0.94446
# min 0.000000 220.000000 2.260000 1.00000
# 25% 0.000000 520.000000 3.130000 2.00000
# 50% 0.000000 580.000000 3.395000 2.00000
# 75% 1.000000 660.000000 3.670000 3.00000
# max 1.000000 800.000000 4.000000 4.00000
# take a look at the standard deviation of each column
print (df.std())
# admit 0.466087
# gre 115.516536
# gpa 0.380567
# prestige 0.944460
# frequency table cutting presitge and whether or not someone was admitted
print (pd.crosstab(df['admit'], df['prestige'], rownames=['admit']))
# prestige 1 2 3 4
# admit
# 0 28 97 93 55
# 1 33 54 28 12
# plot all of the columns
df.hist()
pl.show()
#步驟3:dummify rank #就是把多元變量變成二元變量
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print (dummy_ranks.head())
# prestige_1 prestige_2 prestige_3 prestige_4
# 0 0 0 1 0
# 1 0 0 1 0
# 2 1 0 0 0
# 3 0 0 0 1
# 4 0 0 0 1
# create a clean data frame for the regression
cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':])
print (data.head())#為什么不用prestige_1? prevent multicollinearity, or the dummy variable trap
# admit gre gpa prestige_2 prestige_3 prestige_4
# 0 0 380 3.61 0 1 0
# 1 1 660 3.67 0 1 0
# 2 1 800 4.00 0 0 0
# 3 1 640 3.19 0 0 1
# 4 0 520 2.93 0 0 1
# manually add the intercept
data['intercept'] = 1.0
#步驟4.Performing the regression
train_cols = data.columns[1:]
# Index([gre, gpa, prestige_2, prestige_3, prestige_4], dtype=object)
logit = sm.Logit(data['admit'], data[train_cols])
# fit the model
result = logit.fit()
#步驟5. Interpreting the result
# cool enough to deserve it's own gist
print (result.summary())
# look at the confidence interval of each coeffecient
print (result.conf_int())
# 0 1
# gre 0.000120 0.004409
# gpa 0.153684 1.454391
# prestige_2 -1.295751 -0.055135
# prestige_3 -2.016992 -0.663416
# prestige_4 -2.370399 -0.732529
# intercept -6.224242 -1.755716
#odds ratio
#Take the exponential of each of the coeffecients to generate the odds ratios.
# This tells you how a 1 unit increase or decrease in a variable affects the odds of being admitted.
# odds ratios only
print (np.exp(result.params))
# gre 1.002267
# gpa 2.234545
# prestige_2 0.508931
# prestige_3 0.261792
# prestige_4 0.211938
# intercept 0.018500
#預(yù)測(cè)
data['admit_pred']=result.predict(data[train_cols])
print (data.head())
#更多http://blog.yhathq.com/posts/logistic-regression-and-python.html
########################################################
#5.2 最大熵模型
#原理:同樣是求得模型,使得模型的熵最大,也用最大似然法
#最大熵采取的原則就是:保留全部的不確定性,將風(fēng)險(xiǎn)降到最小
#迭代優(yōu)化技術(shù)
########################################################
#注:(來(lái)自python 自然語(yǔ)言處理)一些迭代優(yōu)化技術(shù)比別的快得多。當(dāng)訓(xùn)練最大熵模型時(shí),應(yīng)避免使用廣義
#迭代縮放(Generalized Iterative Scaling ,GIS)或改進(jìn)的迭代縮放(Improv
#ed Iterative Scaling ,IIS ) , 這兩者都比共軛梯度 (Conjugate Gradient, CG)
#和 BFGS 優(yōu)化方法慢很多。
#樸素貝葉斯分類器和最大熵分類器之間的一個(gè)重要差異是它們可以被用來(lái)回答問(wèn)題的
#類型。樸素貝葉斯分類器是一個(gè)生成式分類器的例子,建立一個(gè)模型,預(yù)測(cè) P(input, label),
#即(input, label)對(duì)的聯(lián)合概率。因此,生成式模型可以用來(lái)回答下列問(wèn)題:
#1. 一個(gè)給定輸入的最可能的標(biāo)簽是什么?
#2. 對(duì)于一個(gè)給定輸入,一個(gè)給定標(biāo)簽有多大可能性?
#3. 最有可能的輸入值是什么?
#4. 一個(gè)給定輸入值的可能性有多大?
#5. 一個(gè)給定輸入具有一個(gè)給定標(biāo)簽的可能性有多大?
#6. 對(duì)于一個(gè)可能有兩個(gè)值中的一個(gè)值 (但我們不知道是哪個(gè)) 的輸入, 最可能的標(biāo)簽
#是什么?
#另一方面,最大熵分類器是條件式分類器的一個(gè)例子。條件式分類器建立模型預(yù)測(cè) P(l
#abel|input)——一個(gè)給定輸入值的標(biāo)簽的概率。 因此, 條件式模型仍然可以被用來(lái)回答問(wèn)題 1
#和 2。然而,條件式模型不能用來(lái)回答剩下的問(wèn)題 3-6。
#一般情況下,生成式模型確實(shí)比條件式模型強(qiáng)大,因?yàn)槲覀兛梢詮穆?lián)合概率 P(input, la
#bel)計(jì)算出條件概率 P(label|input),但反過(guò)來(lái)不行。然而,這種額外的能力是要付出代價(jià)的。
#由于該模型更強(qiáng)大的,它也有更多的“自由參數(shù)”需要學(xué)習(xí)的。而訓(xùn)練集的大小是固定的。
#因此, 使用一個(gè)更強(qiáng)大的模型時(shí), 我們可用來(lái)訓(xùn)練每個(gè)參數(shù)的值的數(shù)據(jù)也更少, 使其難以找
#到最佳參數(shù)值。 結(jié)果是一個(gè)生成式模型回答問(wèn)題 1 和 2 可能不會(huì)與條件式模型一樣好, 因?yàn)?/p>
#條件式模型可以集中精力在這兩個(gè)問(wèn)題上。然而,如果我們確實(shí)需要像 3-6 問(wèn)題的答案, 那
#么我們別無(wú)選擇,只能使用生成式模型。
#生成式模型與條件式模型之間的差別類似與一張地形圖和一張地平線的圖片之間的區(qū)
#別。 雖然地形圖可用于回答問(wèn)題的更廣泛, 制作一張精確的地形圖也明顯比制作一張精確的
#地平線圖片更加困難。
def max_Entropy():
#這里直接使用nltk中的最大熵訓(xùn)練器
import nltk
#1.提取特征,使用一個(gè)字典,這個(gè)字典稱作特征集
#1.1 特征提取器1
def gender_feature(word):
return {'last_letter':word[-1]}
#1.2 特征提取器2
def gender_feature2(word):
return {'suffix1': word[-1:],'suffix2': word[-2:]}
#1.3 特征提取器3 一個(gè)過(guò)擬合的特征提取器
def gender_feature3(name):
feature={}
feature['firstletter']=name[0].lower()
feature['lastletter']=name[-1].lower()
for letter in 'abcdefghijklmnopqrstuvwxyz':
# for letter in name:
feature['count(%s)'%letter]=name.lower().count(letter)
feature['has(%s)'%letter]=(letter in name.lower())
return feature
#2.生成訓(xùn)練集和測(cè)試集(包括預(yù)處理)
from nltk.corpus import names
import random
_names=[(name,'male') for name in names.words('male.txt')]+\
[(name,'female') for name in names.words('female.txt')]
random.shuffle(_names)
#分類器的輸入的特征是 [(特征,組別)```]
featureset=[(gender_feature(name),g) for (name,g) in _names]
train_set,test_set=featureset[500:],featureset[:500]
#另一種變化的做法是 數(shù)據(jù)集分成三部分 開(kāi)發(fā)訓(xùn)練集,開(kāi)發(fā)測(cè)試集,測(cè)試集
#開(kāi)發(fā)測(cè)試集用于檢測(cè),查看錯(cuò)誤
#3.使用最大熵分類器訓(xùn)練數(shù)據(jù)
#classifier=nltk.NaiveBayesClassifier.train(train_set)
classifier=nltk.MaxentClassifier.train(train_set)#對(duì)這個(gè)數(shù)據(jù)集,比樸素貝葉斯的準(zhǔn)確率高點(diǎn)
#4.使用,或者用測(cè)試集評(píng)估質(zhì)量
print(classifier.classify(gender_feature('Neo')))
print(nltk.classify.accuracy(classifier,test_set))
#我們可以檢查分類器,確定哪些特征對(duì)于區(qū)分名字的性別是最有效的。
classifier.show_most_informative_features(5)
########################################################
#5.2 最大熵模型
#原理:同樣是求得模型,使得模型的熵最大,也用最大似然法
#最大熵采取的原則就是:保留全部的不確定性,將風(fēng)險(xiǎn)降到最小
#迭代優(yōu)化技術(shù)
########################################################
#注:(來(lái)自python 自然語(yǔ)言處理)一些迭代優(yōu)化技術(shù)比別的快得多。當(dāng)訓(xùn)練最大熵模型時(shí),應(yīng)避免使用廣義
#迭代縮放(Generalized Iterative Scaling ,GIS)或改進(jìn)的迭代縮放(Improv
#ed Iterative Scaling ,IIS ) , 這兩者都比共軛梯度 (Conjugate Gradient, CG)
#和 BFGS 優(yōu)化方法慢很多。
#樸素貝葉斯分類器和最大熵分類器之間的一個(gè)重要差異是它們可以被用來(lái)回答問(wèn)題的
#類型。樸素貝葉斯分類器是一個(gè)生成式分類器的例子,建立一個(gè)模型,預(yù)測(cè) P(input, label),
#即(input, label)對(duì)的聯(lián)合概率。因此,生成式模型可以用來(lái)回答下列問(wèn)題:
#1. 一個(gè)給定輸入的最可能的標(biāo)簽是什么?
#2. 對(duì)于一個(gè)給定輸入,一個(gè)給定標(biāo)簽有多大可能性?
#3. 最有可能的輸入值是什么?
#4. 一個(gè)給定輸入值的可能性有多大?
#5. 一個(gè)給定輸入具有一個(gè)給定標(biāo)簽的可能性有多大?
#6. 對(duì)于一個(gè)可能有兩個(gè)值中的一個(gè)值 (但我們不知道是哪個(gè)) 的輸入, 最可能的標(biāo)簽
#是什么?
#另一方面,最大熵分類器是條件式分類器的一個(gè)例子。條件式分類器建立模型預(yù)測(cè) P(l
#abel|input)——一個(gè)給定輸入值的標(biāo)簽的概率。 因此, 條件式模型仍然可以被用來(lái)回答問(wèn)題 1
#和 2。然而,條件式模型不能用來(lái)回答剩下的問(wèn)題 3-6。
#一般情況下,生成式模型確實(shí)比條件式模型強(qiáng)大,因?yàn)槲覀兛梢詮穆?lián)合概率 P(input, la
#bel)計(jì)算出條件概率 P(label|input),但反過(guò)來(lái)不行。然而,這種額外的能力是要付出代價(jià)的。
#由于該模型更強(qiáng)大的,它也有更多的“自由參數(shù)”需要學(xué)習(xí)的。而訓(xùn)練集的大小是固定的。
#因此, 使用一個(gè)更強(qiáng)大的模型時(shí), 我們可用來(lái)訓(xùn)練每個(gè)參數(shù)的值的數(shù)據(jù)也更少, 使其難以找
#到最佳參數(shù)值。 結(jié)果是一個(gè)生成式模型回答問(wèn)題 1 和 2 可能不會(huì)與條件式模型一樣好, 因?yàn)?/p>
#條件式模型可以集中精力在這兩個(gè)問(wèn)題上。然而,如果我們確實(shí)需要像 3-6 問(wèn)題的答案, 那
#么我們別無(wú)選擇,只能使用生成式模型。
#生成式模型與條件式模型之間的差別類似與一張地形圖和一張地平線的圖片之間的區(qū)
#別。 雖然地形圖可用于回答問(wèn)題的更廣泛, 制作一張精確的地形圖也明顯比制作一張精確的
#地平線圖片更加困難。
def max_Entropy():
#這里直接使用nltk中的最大熵訓(xùn)練器
import nltk
#1.提取特征,使用一個(gè)字典,這個(gè)字典稱作特征集
#1.1 特征提取器1
def gender_feature(word):
return {'last_letter':word[-1]}
#1.2 特征提取器2
def gender_feature2(word):
return {'suffix1': word[-1:],'suffix2': word[-2:]}
#1.3 特征提取器3 一個(gè)過(guò)擬合的特征提取器
def gender_feature3(name):
feature={}
feature['firstletter']=name[0].lower()
feature['lastletter']=name[-1].lower()
for letter in 'abcdefghijklmnopqrstuvwxyz':
# for letter in name:
feature['count(%s)'%letter]=name.lower().count(letter)
feature['has(%s)'%letter]=(letter in name.lower())
return feature
#2.生成訓(xùn)練集和測(cè)試集(包括預(yù)處理)
from nltk.corpus import names
import random
_names=[(name,'male') for name in names.words('male.txt')]+\
[(name,'female') for name in names.words('female.txt')]
random.shuffle(_names)
#分類器的輸入的特征是 [(特征,組別)```]
featureset=[(gender_feature(name),g) for (name,g) in _names]
train_set,test_set=featureset[500:],featureset[:500]
#另一種變化的做法是 數(shù)據(jù)集分成三部分 開(kāi)發(fā)訓(xùn)練集,開(kāi)發(fā)測(cè)試集,測(cè)試集
#開(kāi)發(fā)測(cè)試集用于檢測(cè),查看錯(cuò)誤
#3.使用最大熵分類器訓(xùn)練數(shù)據(jù)
#classifier=nltk.NaiveBayesClassifier.train(train_set)
classifier=nltk.MaxentClassifier.train(train_set)#對(duì)這個(gè)數(shù)據(jù)集,比樸素貝葉斯的準(zhǔn)確率高點(diǎn)
#4.使用,或者用測(cè)試集評(píng)估質(zhì)量
print(classifier.classify(gender_feature('Neo')))
print(nltk.classify.accuracy(classifier,test_set))
#我們可以檢查分類器,確定哪些特征對(duì)于區(qū)分名字的性別是最有效的。
classifier.show_most_informative_features(5)
http://nuil.cn
總結(jié)
以上是生活随笔為你收集整理的python predictabel_统计学习方法的python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网上书店黑盒测试_网上书店管理系统
- 下一篇: python实现图书管理系统(简单版)