机器学习基础

机器学习本质包含了数学原理推导与实际应用技巧

推论事情的方法:演绎法和归纳法。
根据经验进行推论,就像人成长一样。

基础:

  • 机器学习的目的是:归纳(Induction), 从详细事实到一般推论
  • 找出有效的预测模型

    1. 一开始都是从一个简单的模型开始
    2. 藉由不断喂入训练数据,修改模型
    3. 不断提升预测绩效

机器学习的步骤:

  • 使用者的行为
  • 收集资料
  • 数据转换与清洗
  • 建立模型
  • 验证模型 (建立模型 和 验证模型 之间反复训练与验证)
  • 部署模型

机器学习需要什么?
算法,数据,程序,评估,应用。

应用的方面:
数据挖掘,图像识别,语音和自然语言,统计学习,计算机视觉。

虚拟环境

  1. 通过virtualenv来创建虚拟环境
  2. 通过anaconda来创建虚拟环境
virtualenv

virtualenv就是用来为每一个项目创建一套“独立隔离”的Python运行环境的工具

pip install virtualenv

创建虚拟环境: virtualenv -p /usr/bin/python2.7 --no-site-packages venvs
启动虚拟环境: source venvs/bin/activate
退出虚拟环境: deactivate
删除虚拟环境: rm -r venvs

virtualenv -p /usr/local/bin/python --no-site-packages learn
source learn/bin/activate
deactivate
rm -r learn

可以一次性通过别的机器上或虚拟环境里,将文件里罗列的第三方库安装起来:
pip install -r requirements.txt

anaconda

安装anaconda:anaconda download

# 查看帮助
conda -h 
# 基于python3.6版本创建一个名字为python36的环境
conda create --name python36 python=3.6 
# 激活此环境
source activate python36  
# 再来检查python版本,显示是 3.6
python -V  
# 退出当前环境
source deactivate python36 
# 删除该环境
conda remove -n python36 --all
# 或者 
conda env remove  -n python36

# 查看所以安装的环境
conda info -e

scikit-learn

scikit-learn官网

机器学习地图:

  • 一定量的样本
  • classification
  • clustering
  • regression
  • dimensionality reduction
机器学习问题分类
  • 监督式学习
    回归分析:连续性数值,使用一组已知对应值的数据产生的模型,预测新数据的对应值。
    分类问题:类别标签,根据已知标签的训练数据集,产生一个新模型,用以预测测试数据集的标签。
  • 非监督式学习
    降低维度:产生一有最大变异数的字段线性组合,可用来降低原本问题的维度与复杂度
    分群问题:物以类聚(近朱者赤,近墨者黑)

利用正确的答案的数据来进行学习,就可以称之为监督式学习。
通过既有的答案来得到新的理论,调整一些演算的过程,建立模型。

同样或者类似的数据放在一起,透过放在一起的数据,分析学习,找到需要知道的答案,称之为非监督式学习。

回归分析

  • 线性回归是研究单一因变量与一个或上一个自变量之间的关系
  • 线性回归有两个主要用处:
    预测指的是用已观察的变量来预测因变量
    因果分析则是将自变量当作因变量发生的原因
线性回归

数学模型:

y = ax + b # 简单线性回归
y = ax^2 + bx + c # 二项式线性回归

最小平方估计法:
找出残差平方和最小的一条线

  • 残差计算公式
  • 残差平方和计算公式

绘制资料:

import pandas as pd
from matplotlib import pyplot as plt

df = pd.read_csv('Data/salary.csv', index_col=0)
X = df[['year']]
Y = df['salary'].values

plt.scatter(X, Y, color='blue')
plt.xlabel('year')
plt.ylabel('salary')

plt.show()

绘制回归线:

import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression

df = pd.read_csv('Data/salary.csv', index_col=0)
X = df[['year']]
Y = df['salary'].values

plt.scatter(X, Y, color='blue')
plt.xlabel('year')
plt.ylabel('salary')

# 使用scikit-learn进行预测
regr = LinearRegression()
regr.fit(X, Y)

# 将回归线绘制在图上
print('Coefficients:', regr.coef_) # 涨幅
print('Intercept:', regr.intercept_)

plt.plot(X, regr.predict(X), color='green', linewidth=3)

plt.show()

二次项线性回归:

import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

df = pd.read_csv('Data/salary.csv', index_col=0)
X = df[['year']]
Y = df['salary'].values

# 使用scikit-learn进行预测
poly_reg = PolynomialFeatures(degree=2)  # 二次项
X_ = poly_reg.fit_transform(X)


regr = LinearRegression()
regr.fit(X_, Y)

X2 = X.sort_values(['year'])
X2_ = poly_reg.fit_transform(X2)

plt.scatter(X, Y, color='blue')
plt.plot(X2, regr.predict(X2_), color='green', linewidth=3)
plt.xlabel('year')
plt.ylabel('salary')

# 将回归线绘制在图上
print('Coefficients:', regr.coef_)
print('Intercept:', regr.intercept_)

plt.show()
回归模型评估

验证线性关系是显著的
验证方法通过“假设”
目的:自变量是否有能力去影响自变量。

import pandas as pd
from matplotlib import pyplot as plt
import statsmodels.api as sm

df = pd.read_csv('Data/house-prices.csv')

# 建立Dummy Variable
s = pd.get_dummies(df['Brick']) # 根据字段中的值,建立新的字段,并新的字段的值为0或1 # 必须去掉一个字段,去掉的这个字段通过其它一个字段生成。(如果同时存在,会产生共线性问题)
t = pd.get_dummies(df['Neighborhood']) # 必须去掉一个字段,去掉的这个字段通过其它二个字段生成。

house = pd.concat([df, s, t], axis=1)

del house['No']
del house['West']
del house['Brick']
del house['Neighborhood']
del house['Home']

X = house[['SqFt', 'Bedrooms', 'Bathrooms', 'Offers', 'Yes', 'East', 'North']]
Y = house['Price'].values

X2 = sm.add_constant(X)
est = sm.OLS(Y, X2)
est2 = est.fit()
print(est2.summary()) # 回归模型评估数据

  • 假设显著性标准是0.01
  • 推翻假设的标准是p值 < 0.01 (假设不成立,可以推导出二者变量是密切联系)
  • t = 2.658, P(>t)=0.009, P(0.09) < 0.01是不成立的,假设也不成立
  • 验证二者关系显著

R-squared: 可作为自变量预测因变量准确度的指标。 值越大越准确,0.5以上可以作为指标。
AIC: 鼓励数据拟合的优良性但是尽量避免出现过度拟合的情况。所以优先考虑的模型应该是AIC值最小的那一个.

分析房天下的上海徐汇区数据
import pandas as pd
import time
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot as plt
import statsmodels.api as sm

df = pd.read_excel('Data/house_price_regression.xlsx')

# 处理数据
now_year = time.localtime(time.time()).tm_year
df['age'] = df['age'].map(lambda e: now_year - int(e.strip().strip('建筑年代:')) )
df[['room', 'living_room']] = df['layout'].str.extract(r'(\d+)室(\d+)厅') # 抽取字段, 房间和厅
df['room'] = df['room'].astype(int)
df['living_room'] = df['living_room'].astype(int)
df['total_floor'] = df['floor_info'].str.extract(r'共(\d+)层')
df['total_floor'] = df['total_floor'].astype(int)
df['floor'] = df['floor_info'].str.extract(r'^(.)层')
df['direction'] = df['direction'].map(lambda e: e.strip())

del df['layout']
del df['floor_info']
del df['title']
del df['url']

# 将values处理成字段
df = pd.concat([df, pd.get_dummies(df['direction']), pd.get_dummies(df['floor'])], axis=1)

del df['direction']
del df['floor']
del df['南北向']
del df['低']


# 绘制散布图
# 房价 与 平米
df[['price', 'area']].plot(kind='scatter', x='area', y='price', figsize=[10, 5])


# 绘制线性模型
x = df[['area']]
y = df['price']
regr = LinearRegression()
regr.fit(x, y)

print('Coefficent: {}'.format(regr.coef_))
print('Intercept: {}'.format(regr.intercept_))

plt.scatter(x, y, color='blue')
plt.plot(x, regr.predict(x), linewidth=2, color='red')
plt.xlabel('area')
plt.ylabel('price')

# 多元回归预测
df_col = list(df.columns)
del df_col[2]
x = df[df_col]
y = df['price']
regr = LinearRegression()
regr.fit(x, y)
print(x.info())

# 评估回归模型
x2 = sm.add_constant(x)
est = sm.OLS(y, x2)
est2 = est.fit()
print(est2.summary())

plt.show()

资料分类

监督式学习

分类问题:根据已知标签的训练数据集,产生一个新模型,用以预测测试数据集的标签

决策树:

  • 用于计算一个系统中的失序现象,也就是计算该系统混乱的程度。
  • 决策树的目的行为上的预测和实质的分类

单一变量的计算:

Entropy = -p * log * p - q * log * q

多变量的计算:

你可能感兴趣的:(机器学习,python)