python predictabel_统计学习方法的python实现
########################################################
#5.1 邏輯斯蒂回歸實現
#原理:構造分類模型使得當前的數據集出現的可能性最大-》最大似然法
########################################################
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:得到數據的基本統計信息
# 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
#預測
data['admit_pred']=result.predict(data[train_cols])
print (data.head())
#更多http://blog.yhathq.com/posts/logistic-regression-and-python.html
########################################################
#5.2 最大熵模型
#原理:同樣是求得模型,使得模型的熵最大,也用最大似然法
#最大熵采取的原則就是:保留全部的不確定性,將風險降到最小
#迭代優化技術
########################################################
#注:(來自python 自然語言處理)一些迭代優化技術比別的快得多。當訓練最大熵模型時,應避免使用廣義
#迭代縮放(Generalized Iterative Scaling ,GIS)或改進的迭代縮放(Improv
#ed Iterative Scaling ,IIS ) , 這兩者都比共軛梯度 (Conjugate Gradient, CG)
#和 BFGS 優化方法慢很多。
#樸素貝葉斯分類器和最大熵分類器之間的一個重要差異是它們可以被用來回答問題的
#類型。樸素貝葉斯分類器是一個生成式分類器的例子,建立一個模型,預測 P(input, label),
#即(input, label)對的聯合概率。因此,生成式模型可以用來回答下列問題:
#1. 一個給定輸入的最可能的標簽是什么?
#2. 對于一個給定輸入,一個給定標簽有多大可能性?
#3. 最有可能的輸入值是什么?
#4. 一個給定輸入值的可能性有多大?
#5. 一個給定輸入具有一個給定標簽的可能性有多大?
#6. 對于一個可能有兩個值中的一個值 (但我們不知道是哪個) 的輸入, 最可能的標簽
#是什么?
#另一方面,最大熵分類器是條件式分類器的一個例子。條件式分類器建立模型預測 P(l
#abel|input)——一個給定輸入值的標簽的概率。 因此, 條件式模型仍然可以被用來回答問題 1
#和 2。然而,條件式模型不能用來回答剩下的問題 3-6。
#一般情況下,生成式模型確實比條件式模型強大,因為我們可以從聯合概率 P(input, la
#bel)計算出條件概率 P(label|input),但反過來不行。然而,這種額外的能力是要付出代價的。
#由于該模型更強大的,它也有更多的“自由參數”需要學習的。而訓練集的大小是固定的。
#因此, 使用一個更強大的模型時, 我們可用來訓練每個參數的值的數據也更少, 使其難以找
#到最佳參數值。 結果是一個生成式模型回答問題 1 和 2 可能不會與條件式模型一樣好, 因為
#條件式模型可以集中精力在這兩個問題上。然而,如果我們確實需要像 3-6 問題的答案, 那
#么我們別無選擇,只能使用生成式模型。
#生成式模型與條件式模型之間的差別類似與一張地形圖和一張地平線的圖片之間的區
#別。 雖然地形圖可用于回答問題的更廣泛, 制作一張精確的地形圖也明顯比制作一張精確的
#地平線圖片更加困難。
def max_Entropy():
#這里直接使用nltk中的最大熵訓練器
import nltk
#1.提取特征,使用一個字典,這個字典稱作特征集
#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 一個過擬合的特征提取器
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.生成訓練集和測試集(包括預處理)
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]
#另一種變化的做法是 數據集分成三部分 開發訓練集,開發測試集,測試集
#開發測試集用于檢測,查看錯誤
#3.使用最大熵分類器訓練數據
#classifier=nltk.NaiveBayesClassifier.train(train_set)
classifier=nltk.MaxentClassifier.train(train_set)#對這個數據集,比樸素貝葉斯的準確率高點
#4.使用,或者用測試集評估質量
print(classifier.classify(gender_feature('Neo')))
print(nltk.classify.accuracy(classifier,test_set))
#我們可以檢查分類器,確定哪些特征對于區分名字的性別是最有效的。
classifier.show_most_informative_features(5)
########################################################
#5.2 最大熵模型
#原理:同樣是求得模型,使得模型的熵最大,也用最大似然法
#最大熵采取的原則就是:保留全部的不確定性,將風險降到最小
#迭代優化技術
########################################################
#注:(來自python 自然語言處理)一些迭代優化技術比別的快得多。當訓練最大熵模型時,應避免使用廣義
#迭代縮放(Generalized Iterative Scaling ,GIS)或改進的迭代縮放(Improv
#ed Iterative Scaling ,IIS ) , 這兩者都比共軛梯度 (Conjugate Gradient, CG)
#和 BFGS 優化方法慢很多。
#樸素貝葉斯分類器和最大熵分類器之間的一個重要差異是它們可以被用來回答問題的
#類型。樸素貝葉斯分類器是一個生成式分類器的例子,建立一個模型,預測 P(input, label),
#即(input, label)對的聯合概率。因此,生成式模型可以用來回答下列問題:
#1. 一個給定輸入的最可能的標簽是什么?
#2. 對于一個給定輸入,一個給定標簽有多大可能性?
#3. 最有可能的輸入值是什么?
#4. 一個給定輸入值的可能性有多大?
#5. 一個給定輸入具有一個給定標簽的可能性有多大?
#6. 對于一個可能有兩個值中的一個值 (但我們不知道是哪個) 的輸入, 最可能的標簽
#是什么?
#另一方面,最大熵分類器是條件式分類器的一個例子。條件式分類器建立模型預測 P(l
#abel|input)——一個給定輸入值的標簽的概率。 因此, 條件式模型仍然可以被用來回答問題 1
#和 2。然而,條件式模型不能用來回答剩下的問題 3-6。
#一般情況下,生成式模型確實比條件式模型強大,因為我們可以從聯合概率 P(input, la
#bel)計算出條件概率 P(label|input),但反過來不行。然而,這種額外的能力是要付出代價的。
#由于該模型更強大的,它也有更多的“自由參數”需要學習的。而訓練集的大小是固定的。
#因此, 使用一個更強大的模型時, 我們可用來訓練每個參數的值的數據也更少, 使其難以找
#到最佳參數值。 結果是一個生成式模型回答問題 1 和 2 可能不會與條件式模型一樣好, 因為
#條件式模型可以集中精力在這兩個問題上。然而,如果我們確實需要像 3-6 問題的答案, 那
#么我們別無選擇,只能使用生成式模型。
#生成式模型與條件式模型之間的差別類似與一張地形圖和一張地平線的圖片之間的區
#別。 雖然地形圖可用于回答問題的更廣泛, 制作一張精確的地形圖也明顯比制作一張精確的
#地平線圖片更加困難。
def max_Entropy():
#這里直接使用nltk中的最大熵訓練器
import nltk
#1.提取特征,使用一個字典,這個字典稱作特征集
#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 一個過擬合的特征提取器
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.生成訓練集和測試集(包括預處理)
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]
#另一種變化的做法是 數據集分成三部分 開發訓練集,開發測試集,測試集
#開發測試集用于檢測,查看錯誤
#3.使用最大熵分類器訓練數據
#classifier=nltk.NaiveBayesClassifier.train(train_set)
classifier=nltk.MaxentClassifier.train(train_set)#對這個數據集,比樸素貝葉斯的準確率高點
#4.使用,或者用測試集評估質量
print(classifier.classify(gender_feature('Neo')))
print(nltk.classify.accuracy(classifier,test_set))
#我們可以檢查分類器,確定哪些特征對于區分名字的性別是最有效的。
classifier.show_most_informative_features(5)
http://nuil.cn
總結
以上是生活随笔為你收集整理的python predictabel_统计学习方法的python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网上书店黑盒测试_网上书店管理系统
- 下一篇: java生成表格图片(请假条为例)