帖子

《机器学习入门》学习笔记分享园地 | 讯飞AI大学

  [复制链接]
151****5837 发表于 2020-7-16 01:08:06
51#
#Day 1+学习笔记+07/15
E6E153A8-2EEC-4887-BBD4-D0EE6C854C04.png
92DED5B9-5039-4883-B11D-C3415DBB550C.png
2A8B303C-DF34-4E16-8254-9D4D58F3AA5E.png
使用道具 举报 回复
189****8161 发表于 2020-7-16 16:22:04
52#
output_3_4.png
使用道具 举报 回复
189****8161 发表于 2020-7-16 16:24:08
53#
Python代码实现
首先建立linear_regression.py文件,用于实现线性回归的类文件,包含了线性回归内部的核心函数:
# -*- coding: utf-8 -*-
import numpy as np
class LinerRegression(object):
   def __init__(self, learning_rate=0.01, max_iter=100, seed=None):
       np.random.seed(seed)
       self.lr = learning_rate
       self.max_iter = max_iter
       self.w = np.random.normal(1, 0.1)
       self.b = np.random.normal(1, 0.1)
       self.loss_arr = []
   def fit(self, x, y):
       self.x = x
       self.y = y
       for i in range(self.max_iter):
           self._train_step()
           self.loss_arr.append(self.loss())
#             print('loss:\t{:.3}'.format(self.loss()))
#             print('w: \t{:.3}'.format(self.w))
#             print('b: \t{:.3}'.format(self.b))
   def _f(self, x, w, b):
        return x * w + b
   def predict(self, x=None):
       if x is None:
           x = self.x
       y_pred = self._f(x, self.w, self.b)
       return y_pred
   def loss(self, y_true=None, y_pred=None):
       if y_true is None or y_pred is None:
           y_true = self.y
           y_pred = self.predict(self.x)
       return np.mean((y_true - y_pred)**2)
   def _calc_gradient(self):
       d_w = np.mean((self.x * self.w + self.b - self.y) * self.x)
       d_b = np.mean(self.x * self.w + self.b - self.y)
       return d_w, d_b
   def _train_step(self):
       d_w, d_b = self._calc_gradient()
       self.w = self.w - self.lr * d_w
       self.b = self.b - self.lr * d_b
       return self.w, self.b
建立 train.py 文件,用于生成模拟数据,并调用 liner_regression.py 中的类,完成线性回归任务
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def show_data(x, y, w=None, b=None):
   plt.scatter(x, y, marker='.')
   plt.text(2,200,r'Least Square Method',fontsize=13)
   if w is not None and b is not None:
       plt.plot(x, w*x+b, c='red')
      
   plt.show()
# data generation
np.random.seed(272)
data_size = 100
x = np.random.uniform(low=1.0, high=10.0,size=data_size)
y = x * 20 + 10 + np.random.normal(loc=0.0,scale=10.0, size=data_size)
plt.scatter(x, y, marker='.')
plt.text(2,200,r'Data Set',fontsize=13)
plt.show()
# train / test split
shuffled_index =np.random.permutation(data_size)
x = x[shuffled_index]
y = y[shuffled_index]
split_index = int(data_size * 0.7)
x_train = x[:split_index]
y_train = y[:split_index]
x_test = x[split_index:]
y_test = y[split_index:]
# visualize data
plt.scatter(x_train, y_train, marker='.')
plt.text(2,200,r'Train Data Set(0.7)',fontsize=13)
plt.show()
plt.scatter(x_test, y_test, marker='.')
plt.text(2,200,r'Test Data Set(0.3)',fontsize=13)
plt.show()
# train the liner regression model
regr = LinerRegression(learning_rate=0.01,max_iter=10, seed=314)
regr.fit(x_train, y_train)
print('cost: \t{:.3}'.format(regr.loss()))
print('w: \t{:.3}'.format(regr.w))
print('b: \t{:.3}'.format(regr.b))
show_data(x, y, regr.w, regr.b)
# plot the evolution of cost
plt.scatter(np.arange(len(regr.loss_arr)),regr.loss_arr, marker='o', c='green')
plt.text(6,5000,r'Loss Function',fontsize=13)
plt.show()

使用道具 举报 回复
开放平台用户-m78kwc 发表于 2020-7-16 18:08:15
54#
本帖最后由 开放平台用户-m78kwc 于 2020-7-16 19:45 编辑

# Day 4+学习笔记+07/16

7. R语言实现绘制ROC 和 AUC---用的pROC包中的函数,可以绘制ROC曲线,求AUC的值
> library(pROC)
> library(randomForest)
>
> set.seed(420)
>
> num.samples <- 100
>
> weight <- sort(rnorm(n=num.samples, mean=172, sd=29))
> obese <- ifelse(test=(runif(n=num.samples) < (rank(weight)/100)), yes=1, no=0)
> obese
>
> plot(x=weight, y=obese)
> glm.fit=glm(obese ~ weight, family=binomial)
> lines(weight, glm.fit$fitted.values)
>
> roc(obese, glm.fit$fitted.values, plot=TRUE)
> par(pty = "s")
> roc(obese, glm.fit$fitted.values, plot=TRUE)
> roc(obese, glm.fit$fitted.values, plot=TRUE, legacy.axes=TRUE, percent=TRUE, xlab="False Positive Percentage",
xlab="True Postive Percentage", col="#377eb8", lwd=4)

8. 最小二乘法-线性回归
误差测量---从绝对值到平方值
直线拟合——寻找平方误差最小的拟合直线,改变斜率和截距。
不同斜率的拟合直线的平方误差曲线——最小化问题(“最小二乘”)。
要使观测值与直线之间的距离的平方最小化,通过求导找到平方误差曲线等于零时的位置。
9、Odds和对数Odds
1、Odds:某事发生的次数/某事没发生的次数
     Probability:某事发生的次数/所有事情发生的次数
2、log(Odds):防止两件结果的odds相差过大,得到的对数值是对称的
如:log(6)=1.79 ,log(1/6)=-1.79

即:log(odd)+log(1/odd)=0



使用道具 举报 回复
189****9142 发表于 2020-7-16 19:58:25
55#
Day4 比值比(odds ratios)及比值比对数
1、odds ratios
odds ratios就是两个odds的比值。
作用:比值比及比值比对数可以衡量两者(两件事情)之间是否存在关系,关系强弱如何,
计算出来的数值越大,两者之间的关系越大。
2、判断某个事件的odds ratios或者odds ratios的对数是否有统计学意义的三种方法
①费舍尔精确检验
②卡方测试
③瓦尔德检验

使用道具 举报 回复
152****0061 发表于 2020-7-16 21:36:46
56#
#Day4 + 学习笔记 +07/16 ML_D4.png

使用道具 举报 回复
匿名  发表于 2020-7-16 22:04:09
57#
#day4+学习笔记+7/16
Odds Ratio
1、Odd Ratio用于表示两件事情的关联性,数值越高说明关联性越强
2、判断Odd Ratio是否有统计意义的3中方法:1)Fisher’ Exact Test  2)Chi-Square Test   3)The Wald Test
3、三种检验方法都有效,具体选择看那种用的多

逻辑回归(logistic regression)
1、可以使用The Wald Test来判断该特征是否对结果有影响
2、y轴表示的是possibility(事件发生概率),范围在0~1

使用道具 回复
155****1852 发表于 2020-7-16 22:10:47 来自手机
58#
#Day4+学习笔记+07/16                比值和比值对数 opos ratio 表示两件事直接的关系 取对数是为了对称便于比较 Fisher's exact test( 费希尔精确检验)      是用于分析列联表统计显著性检验方法,它用于检验两个分类的关联。虽然实际中常常使用于小数据情况,但同样适用于大样本的情况。 Chi-square Test 卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。
使用道具 举报 回复
188****6584 发表于 2020-7-16 22:19:03
59#
Day4:
12. odds ratio: 不同odds的比率
->对该比例取对数,分布则对称
->取对数前后表示变量间的关系
13. 如何看是否具有统计学意义
① 费舍尔检验:适用于样本量<40或者理论频数(原假设成立,每个格子理论上应该出现的频数)T<1
->超几何分布
② 卡方检验:算p值
Step1: 先用总患癌数/总人数来得到患癌症概率p
Step2: 利用基因变异总人数和不变异总人数来计算下表理论人数
Step3: 计算p值
③ 沃尔德检验
基本假设:odds ratio的对数与odds的对数一样,都符合正态分布
p值越小,拒绝原假设的理由越充分


使用道具 举报 回复
189****5605 发表于 2020-7-16 23:09:26
60#
本帖最后由 189****5605 于 2020-7-16 23:15 编辑

# day2 学习笔记 7/16

## 敏感性及特异性

1. 敏感性是用真阳性除以真阳性+假阳性之和



   敏感性Sensitivity=
   $$
   \frac{True Positives}{True Positives + False Negatives}
   $$
   2. 特异性指的是算法正确识别出患者没有心脏病的百分比:

   特异性Specificity =
   $$
   \frac{True Negatives}{True Negatives + False Positives}
   $$

   ## 偏差及方差

   1. 偏差指真实值与预测值之间的差值
   2. 方差指的偏差的平方
   3. 最小二乘法
   4. 逻辑回归
   5. 防止过拟合等

   ## ROC (Receiver Operating Characteristic)

   ##  AUC(Area Under Curve)

   1.ROC是一个用于度量分类中的非均衡性的工具,ROC曲线及AUC常被用来评价一个二值分类器的优劣。

      **ROC曲线越接近左上角,该分类器的性能越好,**意味着分类器在假阳率很低的同时获得了很高的真阳率。

   2. AUC

   AUC(Area Under Curve) 被定义为ROC曲线下的面积,因为ROC曲线一般都处于y=x这条直线的上方,所以取值范围在0.5和1之间,使用AUC作为评价指标是因为ROC曲线在很多时候并不能清晰地说明哪个分类器的效果更好,而AUC作为一个数值,其值越大代表分类器效果更好。



   首先AUC是一个概率值,当随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的分数将这个正样本排在负样本前面的概率就是AUC值。所以,AUC的值越大,当前的分类算法越有可能将正样本排在负样本值前面,既能够更好的分类。



使用道具 举报 回复