Udacity 机器学习笔记1

机器学习

logistics regression(LR)

回归问题:返回连续的值
分类问题:返回状态
基于最大似然估计的方法,最小化模型分布和经验分部之间的交叉熵。损失函数为
在这里插入图片描述
远离分界线的点,权值越低。

support vector machine(SVM)

SVM基于最大化分类间隔的原理,只考虑分界线附近的支持向量,在支持向量外添加任何样本点,其权值为0,对分类结果无任何影响。损失函数为
在这里插入图片描述

神经网络(neural network)

将数据基于标签划分区域

核方法

将低维空间的非线性可分问题转化成高维空间的线性可分问题

k均值聚类(k-means clustering)

适用于已知数据集有k个集群的情况。

  1. 随机选择k个点作为聚类中心;
  2. 对数据集中的每个点,计算其到每个聚类中心的距离,并将其划分到对应聚类中心所属的集合;
  3. 对新得到的集合进行重新计算聚类中心(均值);
  4. 若得到的聚类中心与之前的差值小于一定阈值或已收敛,则算法结束,否则重复2-3步骤。

分层聚类

已知数据集有N个点(即初始有N个集合),设定集合之间的相似度阈值为r。

  1. 计算每个点和其他点之间的距离,将距离最近的点划分为一个集合;
  2. 计算得到的新集合和其他集合之间的最近距离,将距离最近的两个集合划分为一个集合;
  3. 若两个集合之间的距离大于设定的阈值r,则算法结束,否则重复步骤2。

实战项目

  1. Titanic生存率分析
    pandas:Python data analysis library,数据结构有series,与numpy中的array相似,只允许存储相同的数据类型;time-series,以时间为索引的series;dataframe,二维的表格型数据结构,可以看成是series组成的字典,
    将df按性别分组求身高的平均值
    df.groupby(‘性别’)[‘身高’].mean()
dates=pd.date_range('20180310',periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A','B','C','D'])#生成64列位置
print(df)#输出64列的表格
'''
                   A         B         C         D
2018-03-10 -0.092889 -0.503172  0.692763 -1.261313
2018-03-11 -0.895628 -2.300249 -1.098069  0.468986
2018-03-12  0.084732 -1.275078  1.638007 -0.291145
2018-03-13 -0.561528  0.431088  0.430414  1.065939
2018-03-14  1.485434 -0.341404  0.267613 -1.493366
2018-03-15 -1.671474  0.110933  1.688264 -0.910599
  '''
print(df['B'])
'''
2018-03-10   -0.927291
2018-03-11   -0.406842
2018-03-12   -0.088316
2018-03-13   -1.631055
2018-03-14   -0.929926
2018-03-15   -0.010904
Freq: D, Name: B, dtype: float64
 '''

#创建特定数据的DataFrame
df_1=pd.DataFrame({'A' : 1.,
                    'B' : pd.Timestamp('20180310'),
                    'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                    'D' : np.array([3] * 4,dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train"]),
                    'F' : 'foo'
                    })
print(df_1)
'''
     A          B    C  D      E    F
0  1.0 2018-03-10  1.0  3   test  foo
1  1.0 2018-03-10  1.0  3  train  foo
2  1.0 2018-03-10  1.0  3   test  foo
3  1.0 2018-03-10  1.0  3  train  foo
'''
print(df_1.dtypes)
'''
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object
'''
print(df_1.index)#行的序号
#Int64Index([0, 1, 2, 3], dtype='int64')
print(df_1.columns)#列的序号名字
#Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
print(df_1.values)#把每个值进行打印出来
'''
[[1.0 Timestamp('2018-03-10 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2018-03-10 00:00:00') 1.0 3 'train' 'foo']
 [1.0 Timestamp('2018-03-10 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2018-03-10 00:00:00') 1.0 3 'train' 'foo']]
 '''
print(df_1.describe())#数字总结
'''
         A    C    D
count  4.0  4.0  4.0
mean   1.0  1.0  3.0
std    0.0  0.0  0.0
min    1.0  1.0  3.0
25%    1.0  1.0  3.0
50%    1.0  1.0  3.0
75%    1.0  1.0  3.0
max    1.0  1.0  3.0
'''
print(df_1.T)#翻转数据
'''
                     0                    1                    2  \
A                    1                    1                    1   
B  2018-03-10 00:00:00  2018-03-10 00:00:00  2018-03-10 00:00:00   
C                    1                    1                    1   
D                    3                    3                    3   
E                 test                train                 test   
F                  foo                  foo                  foo   

                     3  
A                    1  
B  2018-03-10 00:00:00  
C                    1  
D                    3  
E                train  
F                  foo  
'''
print(df_1.sort_index(axis=1, ascending=False))#axis等于1按列进行排序 如ABCDEFG 然后ascending倒叙进行显示
'''
     F      E  D    C          B    A
0  foo   test  3  1.0 2018-03-10  1.0
1  foo  train  3  1.0 2018-03-10  1.0
2  foo   test  3  1.0 2018-03-10  1.0
3  foo  train  3  1.0 2018-03-10  1.0
'''
print(df_1.sort_values(by='E'))#按值进行排序
'''
     A          B    C  D      E    F
0  1.0 2018-03-10  1.0  3   test  foo
2  1.0 2018-03-10  1.0  3   test  foo
1  1.0 2018-03-10  1.0  3  train  foo
3  1.0 2018-03-10  1.0  3  train  foo
'''

display(data.head()) #默认展示数据的前五行
data.drop(‘Survived’,axis=1) #axis=1删除Survived这一列,axis=0,删除index即行
data.loc() #按照索引进行行列选择,包含索引的开头结尾,如[1:5],包含第五行

str.format() #格式化字符串

通过位置

In [1]: '{0},{1}'.format('kzc',18) 
Out[1]: 'kzc,18' 
In [2]: '{},{}'.format('kzc',18) 
Out[2]: 'kzc,18' 
In [3]: '{1},{0},{1}'.format('kzc',18) 
Out[3]: '18,kzc,18'

通过参数

In [5]: '{name},{age}'.format(age=18,name='kzc') 
Out[5]: 'kzc,18'

通过对象属性

class Person: 
    def __init__(self,name,age): 
        self.name,self.age = name,age 
    def __str__(self): 
        return 'This guy is {self.name},is {self.age} old'.format(self=self)

填充与对齐
填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

In [15]: '{:>8}'.format('189') 
Out[15]: ' 189' 
In [16]: '{:0>8}'.format('189') 
Out[16]: '00000189' 
In [17]: '{:a>8}'.format('189')
Out[17]: 'aaaaa189'

指定精度和类型,其中.2表示长度为2的精度,f表示float类型

In [44]: '{:.2f}'.format(321.33345) 
Out[44]: '321.33'

统计学知识

四分位距法:
四分位数是将数列等分成四个部分的数,一个数列有三个四分位数,设下四分位数、中位数和上四分位数分别为Q1、Q2、Q3,则:Q1、Q2、Q3的位置可由下述公式确定:
Q1的位置 1(n+1)/4
Q2的位置 2 (n+1) /4
Q3的位置 3(n+1)/4
例如:某车间某月份的工人生产某产品的数量分别为13、13.5、13.8、13.9、14、14.6、14.8、15、15.2、15.4公斤,则三个四分位数的位置分别为:
Q1的位置 (n+1)/4 =(10+1)/4=2.75
Q2的位置(n+1) /2=(10+1)/2=5.5
Q3的位置3(n+1)/4=3(10+1)/4=8.25
即变量数列中的第2.75项、第5.5项、第8.25项工人的某种产品产量分别为下四分位数、中位数和上四分位数。即:
Q1=0.25×第二项+0.75×第三项=0.25×13.5+0.75×13.8=13.73(公斤)
Q2=0.5×第五项+0.5×第六项=0.5×14+0.5×14.6=14.3(公斤)
Q3=0.75×第八项+0.25×第九项=0.75×15+0.25×15.2=15.05(公斤)

异常值(outlier):
常规判定法:异常值是指一组测定值中与平均值的偏差超过两倍标准差的测定值,与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值。
箱型判定法:上四分位和下四分位(Q1、Q3)的差值为IQR,上界U=Q1+1.5IQR,下界D=Q3-1.5IQR,超过上下界的为异常值。

贝塞尔修正

标准差,方差:分别是样本标准差,总体标准差,样本方差,总体方差

读取数据集(csv文件)

data = pandas.read_csv(‘file_name.csv’) #读取的格式为dataframe

转化为数组

x = np.array(data[[‘x1’,‘x2’]]) #存储为特征x,若希望获得多列,则需要输入列表
y = np.array(data[‘y’]) #存储为标签y

sklearn中训练模型

定义分类器,然后使分类器和数据拟合。classifier.fit(X,y)
以下是常用的分类器,以及必须导入的文件包

逻辑回归

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()

神经网络

from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()

决策树

from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()

SVM

from sklearn.svm import SVC
classifier = SVC()

核函数

K(x, y):表示样本 x 和 y,添加多项式特征得到新的样本 x’、y’,K(x, y) 就是返回新的样本经过计算得到的值;在 SVM 类型的算法 SVC() 中,K(x, y) 返回点乘:x’ . y’ 得到的值;
在这里插入图片描述
多项式特征的基本原理:依靠升维使得原本线性不可分的数据线性可分;
升维的意义:使得原本线性不可分的数据线性可分

高斯核:唯一超参数γ,手动调参的关键
在这里插入图片描述
目的是对样本数量少,特征多的数据集进行降维,找到更利于线性分类的空间

高斯核函数,也称为 RBF 核(Radial Basis Function Kernel),也称为径向基函数;
高斯核函数的本质:将每一个样本点映射到一个无穷维的特征空间;
无穷维:将 mn 的数据集,映射为 mm 的数据集,m 表示样本个数,n 表示原始样本特征种类,样本个数是无穷的,因此,得到的新的数据集的样本也是无穷维的;
高斯核升维的本质,使得线性不可分的数据线性可分;

训练模型

训练集测试集的划分
scikit-learn
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X ,y, test_size = 0.25,stratify=y)
stratify:使训练集和测试集中y的比例与原数据集相同如y取0,1=2:8

# Import statements 
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
#Import the train test split
# http://scikit-learn.org/0.16/modules/generated/sklearn.cross_validation.train_test_split.html


# Read in the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# Use train test split to split your data 
# Use a test size of 25% and a random state of 42
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.25,random_state =42)

# Instantiate your decision tree model
model = DecisionTreeClassifier()

# TODO: Fit the model to the training data.
model.fit(X_train,y_train)
# TODO: Make predictions on the test data
y_pred = model.predict(X_test)

# TODO: Calculate the accuracy and assign it to the variable acc on the test data.
acc = accuracy_score(y_test,y_pred)
  1. 读取csv文件
  2. 添加到特征和标签变量。转化为数组
  3. 划分训练集和测试集
  4. 选择训练模型 #model
  5. 用训练模型拟合训练集 #model.fit(X_train,y_train)
  6. 预测测试集的输出 #model.predict(X_test)
  7. 验证预测输出的准确性 accuracy_score(y_test,y_pred)

评估指标

混淆矩阵

真阳性:true positive
真阴性:true negative
假阳性:false positive
假阴性:false negative

准确率

accuracy = true / all

精度

在这里插入图片描述
即预测为正确的样本中实际正确的样本所占比例。

召回率

recall = true positives / true positives + false negatives
即实际正确的样本中你预测为正确的样本所占比例。

F1分数(harmonic mean)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ROC曲线

在这里插入图片描述
横坐标为FPR,纵坐标为TPR,与x轴围成的面积AUC为判定标准

评估回归模型的指标

  1. 平均绝对误差(mean absolute error):各点到拟合曲线的绝对距离(y的差值)的平均值
  2. 均方误差(mean squared error):各点到拟合曲线的距离平方的平均值
  3. R2 score:(0,1),越接近1,model越好,即模型与直接预测每个值为平均值的模型的差距越大,说明模型效果越好。
    在这里插入图片描述

模型选择

错误类型

  1. underfitting:we get errors due to high bias,过度简化问题,
  2. overfitting:we get errors due to high variance,过度复杂化问题

交叉验证集

cross validation set: 用来决定模型,例如多项式的次数
在这里插入图片描述
k-fold cross validation:将交叉验证集数据划分成k份,训练模型k次,每次轮流取不同的几份数据作为测试集,剩余数据作为训练集,然后对得到的结果取平均,得到最终模型

from sklearn.model_selection import KFold
kf = KFold(data_size,teseting data_size,shuffle = true)

学习曲线

在这里插入图片描述high bias:欠拟合,训练误差和验证误差收敛在误差较大的地方;
high variance:过拟合,训练误差和验证误差相差较大

网格搜索(grid search)

目的:给网络选择最佳参数,例如SVM中 kernal和C,以sklearn为例

  1. 导入GridSearchCV
from sklearn.model_selection import GridSearchCV
  1. 选择参数,形成一个列表
parameters = {'kernals':['poly',rbf'], 'c':[0.1, 1, 10]}
  1. 选择一个评分机制(scorer)为候选模型打分
from sklearn.metrics import make_scorer
from sklearn.metrics import f1_score
scorer =  make_scorer(f1_score)
  1. 使用参数和评分机制创建一个GridSearch对象。使用此对象fit the data。
grid_obj = GridSearchCV(clf, parameters, scoring = scorer)
grid_fit = grid_obj.fit(X,y)
  1. 获得最佳估算器
best_clf = grid_fit.best_estimator_

猜你喜欢

转载自blog.csdn.net/wezard95/article/details/104827684