Python预测分析(1):关于预测的两类核心算法

    本书涉及的机器学习问题通常是指“函数逼近”问题。是有监督学习问题的一个子集。线性回归和逻辑回归是解决此类函数逼近问题最常见的算法。函数逼近问题包含了各种领域中的分类问题和回归问题,如文本分类、搜索响应、广告放置、垃圾邮件过滤、用户行为预测、诊断等。从广义上说,本书涵盖了解决函数逼近问题的两类算法:惩罚线性回归和集成方法。

    为什么这两类算法如此有用?

1.“An Empirical Comparison of Supervised Learning Algorithms,” Rich Caruana, Alexandru Niculescu-Mizi

    本书涵盖的算法提升决策树(Boosted Decision Trees)、随机森林(Random Forests)、投票决策树(Bagged Decision Trees)和逻辑回归(Logistic Regression)

2.“An Empirical Evaluation of Supervised Learning in High Dimensions,” Rich Caruana,Nikos Karampatziakis 和 Ainur Yessenalina

     惩罚回归方法是由普通最小二乘法(OLS)衍生出来的。OLS的一个根本问题就是有时它会过拟合。惩罚线性回归可以减少自由度使之与数据规模、问题的复杂度相匹配。对于具有大量自由度的问题,惩罚线性回归方法获得了广泛的应用。(统计学上的自由度是指当以样本的统计量来估计总体的参数时,样本中独立或能自由变化的自变量的个数称为该统计量的自由度),基因问题,通常其自由度(基因的数目)是数以万计的;文本分类问题,其自由度可以超过百万。

     集成方法的基本思想是构建多个不同的预测模型,然后将其输出做某种组合作为最终的输出,如平均值或采用多数人的意见。单个预测模型叫作基学习器(base learners)。计算学习理论(computation learning theory)的研究结果证明只要基学习器比随机猜测稍微好些,那么集成方法就可以达到相当好的效果。

2、通过理解数据来了解问题

     属性和标签的不同类型决定模型的选择,主要原因是很多机器学习算法只能处理数值变量,不能处理类别变量或因素变量。例如,惩罚回归算法只能处理数值变量,SVM、核方法、KNN也是同样。

    当标签是数值的,就叫作回归问题。当标签是类别的,就叫作分类问题。一个分类器就相当于只算出一个等高线,而不再考虑与这条分界线的远近距离之类的问题,而回归的方法就相当于要绘制一个完整的地形图。

     新数据集的注意事项:

  • 行数、列数、规模
  • 类别变量的数目、类别的取值范围
  • 缺失的值
  • 属性和标签的统计特性

2.2、分类问题:用声纳发现未爆炸的水雷

数据集来自UC Irvine数据仓库:测试声纳是否可以用于检测在港口军事行动后遗留下来的未爆炸的水雷。

数据集的物理特性rockVminesSummaries.py

__author__ = 'mike_bowles'
import urllib2
import sys

target_url = ("https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data")
data = urllib2.urlopen(target_url)

xList = []
labels = []
for line in data:
	row = line.strip().split(",")
	xList.append(row)

sys.stdout.write("Number of Rows of Data = " + str(len(xList)) + '\n')
sys.stdout.write("Number of Columns of Data = " + str(len(xList[1])))
Number of Rows of Data = 208
Number of Columns of Data = 61

 如果数据集规模增加到1000x1000,惩罚线性回归训练时间将不到一分钟,而集成方法训练时间需要几分钟。万级规模,则惩罚线性回归的训练时间将达到3~4小时,而集成方法则长达12~24小时。

确定每个属性的特征

  第一步计算此属性的均值和方差,可以加强直观感受

  第二步找到异常值,一种方法是:将一组数字按照百分位数进行划分。例如,第25百分位数是含有最小的25%的数,第50百分位数是含有最小的50%的数。把这种分组可视化最简单的方法是假想把这些数据按顺序排列。使用Python的probplot函数来帮助确认数据中是否含有异常点。分布图展示了数据的百分位边界与高斯分布的同样百分位的边界对比。如果此数据服从高斯分布,则画出来的点应该是一条直线。

Pandas工具包可以帮助自动化数据统计分析的过程,已经被证实在数据预处理阶段特别有用。Pandas工具包可以将数据读入一种特定的数据结构,叫作数据框(data frame),其是依据CRAN-R数据结构建模的。可以把数据框当成一个表格或者类似矩阵的数据结构。Pandas可以自动计算出均值、方差、分位树。

可视化展示

    对于具有多个属性问题的一种可视化方法叫作平行坐标图

    了解属性之间的关系可以绘制属性与标签的交会图 (又叫作散点图)展示了这些属性对之间关系的密切程度。基本上,如果散点图上的点沿着一条“瘦"直线排列,则说明这两个变量强相关;如果这些点形成一个球型,则说明这些点不相关。

第35属性与标签的关系

两个属性的相关程度可以由皮尔逊相关系数来量化

用热图(heat map)展示属性和标签的相关性

如果问题有100以上的属性,则很难把散点图压缩到一页。获得大量属性之间相关性的一种方法是计算出每对属性的皮尔森相关系数后,将相关系数构成一个矩阵,然后把这些矩阵元素画到热图上。沿着斜对角线的浅色区域证明索引值相近的属性相关性较高。

# -*- coding: utf-8 -*-
__author__ = 'mike_bowles'
import urllib2
import sys

target_url = ("https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data")
data = urllib2.urlopen(target_url)

xList = []
labels = []
for line in data:
	row = line.strip().split(",")
	xList.append(row)
# 数据行列数
nrow = len(xList)
ncol = len(xList[1])

# 数据的属性,是数值还是类别型
type = [0]*3
colCounts = []

for col in range(ncol):
	for row in xList:
		try:
			a = float(row[col])
			if isinstance(a, float):
				type[0] += 1
		except ValueError:
			if len(row[col]) > 0:
				type[1] += 1
			else:
				type[2] += 1
	colCounts.append(type)
	type = [0]*3

sys.stdout.write("Col#" + '\t' + "Number" + '\t' + "Strings" + '\t ' + "Other\n")

iCol = 0
for types in colCounts:
	sys.stdout.write(str(iCol) + '\t\t' + str(types[0]) + '\t\t' + str(types[1]) + '\t\t' + str(types[2]) + "\n")
	iCol += 1

# 获取数值型属性的描述性统计信息和类别型属性具体类型的数量分布
import numpy as np

type = [0]*3
colCounts = []

col = 3
colData = []
for row in xList:
	colData.append(float(row[col]))

colArray = np.array(colData)
colMean = np.mean(colArray)
colsd = np.std(colArray)
sys.stdout.write("Mean = " + '\t' + str(colMean) + '\t\t' + "Standard Deviation = " + '\t' + str(colsd) + "\n")
# calculate quantile boundaries
ntiles = 4
percentBdry = []
for i in range(ntiles+1):
	percentBdry.append(np.percentile(colArray, i*(100)/ntiles))
sys.stdout.write("\nBoundaries for 4 Equal Percentiles \n")
print(percentBdry)
sys.stdout.write(" \n")

ntiles = 10
percentBdry = []
for i in range(ntiles+1):
	percentBdry.append(np.percentile(colArray, i*(100)/ntiles))
sys.stdout.write("\nBoundaries for 10 Equal Percentiles \n")
print(percentBdry)
sys.stdout.write(" \n")

#The last column contains categorical variables
col = 60
colData = []
for row in xList:
	colData.append(row[col])

unique = set(colData)
sys.stdout.write("Unique Label Values \n")
print(unique)

# count up the number of elements having each value
catDict = dict(zip(list(unique), range(len(unique))))
catCount = [0]*2
for elt in colData:
	catCount[catDict[elt]] += 1
sys.stdout.write("\nCounts for Each Value of Categorical Label \n")
print(list(unique))
print(catCount)

# 分位图
import pylab
import scipy.stats as stats

col = 3
colData = []
for row in xList:
	colData.append(float(row[col]))

#stats.probplot(colData, dist="norm", plot=pylab)
#pylab.show()

# 用Pandas读入数据、分析数据
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plot

rocksVMines = pd.read_csv(target_url, header=None, prefix="V")
print(rocksVMines.head())
print(rocksVMines.tail())
# print summary of data frame
summary = rocksVMines.describe()
print(summary)
'''
# 平行坐标图
for i in range(208):
	if rocksVMines.iat[i, 60] == "M":
		pcolor = "red"
	else:
		pcolor = "blue"
	# plot rows of data as if they were series data
	dataRow = rocksVMines.iloc[i, 0:60]
	dataRow.plot(color=pcolor)

plot.xlabel("Index")
plot.ylabel("Values")
plot.show()
'''

# 交会图
dataRow2 = rocksVMines.iloc[1, 0:60]
dataRow3 = rocksVMines.iloc[2, 0:60]
plot.scatter(dataRow2, dataRow3)
plot.xlabel("2nd Attribute")
plot.ylabel("3rd Attribute")
plot.show()

dataRow21 = rocksVMines.iloc[20, 0:60]
plot.scatter(dataRow2, dataRow21)
plot.xlabel("2nd Attribute")
plot.ylabel("21st Attribute")
plot.show()

# 第35属性
target = []
for i in range(208):
	if rocksVMines.iat[i, 60] == "M":
		target.append(1.0)
	else:
		target.append(0.0)
dataRow = rocksVMines.iloc[0:208, 35]
plot.scatter(dataRow, target)
plot.xlabel("Attribute Value")
plot.ylabel("Target Value")
plot.show()

from random import uniform
target = []
for i in range(208):
	if rocksVMines.iat[i, 60] == "M":
		target.append(1.0 + uniform(-0.1, 0.1))
	else:
		target.append(0.0 + uniform(-0.1, 0.1))
dataRow = rocksVMines.iloc[0:208, 35]
plot.scatter(dataRow, target, alpha=0.5, s=120)
plot.xlabel("Attribute Value")
plot.ylabel("Target Value")
plot.show()	

# 热图
corMat = DataFrame(rocksVMines.corr())
plot.pcolor(corMat)
plot.show()

2.4、基于因素变量的实数值预测:鲍鱼的年龄

     鲍鱼数据集的问题是根据某些测量值

2.5 用实数值属性预测实数值目标:评估红酒口感

        每一种红酒都有一系列化学成分的测量指标,包括酒精含量、挥发性酸、亚硝酸盐。每种红酒都有一个口感评分值,是三个专业评酒员的评分的平均值。问题是构建一个预测模型,输入化学成分的测量值,预测口感评分值,使之与评酒员的评分一致。

2.6 多类别分类问题:它属于哪种玻璃

         多分类问题         

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值