########################################################

#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实现相关推荐

  1. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  2. 缺失数据em算法python_重磅!李航《统计学习方法》Python 代码更新,适应第二版!...

    重磅!李航<统计学习方法>Python 代码更新,适应第二版! 点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 李航的<统计 ...

  3. python接收输入的一行字符只统计数字的个数,Python(统计字符),python实例,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数...

    Python(统计字符),python实例,输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数 题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 程序分析:利用 ...

  4. python 涨停统计_用Python,tushare做一个A股每日收盘行情监测分析(含源代码)

    灵感:对于交易者来说,每日收盘分析是一件必要的功课.现在的看盘软件种类很多,已经有很多整理好的数据,但是对于高阶玩家,可能需要更多自定义化的功能,做出自己的每日分析报表.那我们何不尝试用Python做 ...

  5. python做统计_利用 Python 进行统计

    你将学到什么 Create and interpret data visualizations using the Python programming language and associated ...

  6. python闰年统计_利用Python写一个闰年计算器和每月天数计算器

    闰年计算器 题目:输入年份,判断该年是否为闰年. 方法:1.能被400整除的年份 2.能被4整除,但不能被100整除 1 print('---闰年判断器kql,按q退出---') 2 while Tr ...

  7. python考勤统计_face++与python实现人脸识别签到(考勤)功能

    face++与python实现人脸识别签到(考勤)功能 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  face++与python实现人脸识别签到(考勤)功能.t ...

  8. python关键词统计_使用Python快速统计关键词及其词频

    版权声明:转载附链接哦.https://blog.csdn.net/weixin_43886356/article/details/86711012 思路: 1.通过jieba库分词获取所有的词语列表 ...

  9. python成绩统计_用Python操作Excel,实现班级成绩的统计

    本次是在原来有一定格式的Excel文档中补充成绩. 安装的模块:xlwt . xlrd .xlutils xlrd的模块是只用读取xls文件,不能写文件,同理xlwt,只(新建写)不读已有的xls, ...

最新文章

  1. mybatis中的TypeHandler设计与实现
  2. 数据查询语言(DQL)
  3. Kettle 系列随笔
  4. kali中安转python3_Kali环境下安装Python3.7
  5. 201521123040《Java程序设计》第10周学习总结
  6. MATLAB基础学习笔记02:掌握MATLAB运算
  7. 数据分析的5层解读,报表仍是有效的落地实践!
  8. 33. 深入解析互联网协议的原理
  9. quartus 13.1自带仿真测试流程
  10. 安装delphi 10.4 社区版
  11. 算法竞赛入门经典(第二版)习题代码语言篇(一)
  12. 矩阵求导及其链式法则
  13. matlab安装matconvnet
  14. 低功耗设计—level shifter
  15. 笔记本cpu型号怎么看?笔记本处理器型号的类型与查看方法
  16. 虚拟机上键盘右边的数字小键盘为什么不能使用
  17. 计算机考研专业课——c语言
  18. Qt中文编程遇C2001错误,提示“常量中有换行符”
  19. YOCTO开机画面修改
  20. AD软件绘制stm32最小系统电路原理图与PCB图

热门文章

  1. BSN开放联盟链巡礼——文昌链的技术、架构、应用介绍
  2. 2093321-19-6,PSMA-1007PSMA1007特异性膜抗原(PSMA)抑制剂
  3. windows下架设SVN服务器并设置开机启动
  4. 【论文阅读-NeurIPS-2019】Coda: An End-to-End Neural Program Decompiler
  5. 计算机类大学生可以参加的5个比赛
  6. 山东大学软件学院项目实训第一周
  7. [BZOJ2539][CTSC2000][KM]丘比特的烦恼
  8. 长沙计算机应届生工资水平,长沙毕业生期望的平均月薪是多少?答案在这里
  9. Python LeetCode(13.罗马数字转整数)
  10. 立德教育净利润下滑四成:股价早已“腰斩”,拟并购一所高校