机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个 样本,用𝑥𝑖来表示,其中𝑖 = 1, 2, 3, . . . , 𝑁,共N个样本,每个样本𝑥𝑖 = (𝑥𝑖1, 𝑥𝑖2, . . . , 𝑥𝑖𝑝, 𝑦𝑖)共p+1个维度,前p个维度的每个维度我们称为一个 特征,最后一个维度𝑦𝑖我们称为 因变量(响应变量)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本𝑥𝑖,一列表示一个特征。
我们对数据的形式作出如下约定:
第i个样本: x i = ( x i 1 , x i 2 , . . . , x i p , y i ) T x_i = (x_{i1},x_{i2},...,x_{ip},y_i)^T xi=(xi1,xi2,...,xip,yi)T
因变量 y i = ( y 1 , y 2 , . . . , y N ) T y_i = (y_1,y_2,...,y_N)^T yi=(y1,y2,...,yN)T
第k个特征: x ( k ) = ( x k 1 , x k 2 , . . . , x N p ) T x^{(k)} = (x_{k1},x_{k2},...,x_{Np})^T x(k)=(xk1,xk2,...,xNp)T
特征矩阵 x i = ( x 1 , x 2 , . . . , x N ) T x_i = (x_1,x_2,...,x_N)^T xi=(x1,x2,...,xN)T
根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习。
- 有监督学习
给定某些特征去估计因变量,即因变量存在的时候,我们称这个机器学习任务为有监督学习。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。 - 无监督学习
给定某些特征但不给定因变量,建模的目的是学习数据本身的结构和关系。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。
根据因变量的是否连续,有监督学习又分为回归和分类:
- 回归
因变量是连续型变量,如:房价,体重等。 - 分类
因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。
机器学习常用库:
库 | 应用 |
---|---|
numpy | 数据分析处理 |
pandas | 数据分析处理 |
matplotlib.pyplot | 可视化 |
seaborn | 在Matplotlib上进行了更高级的API封装数据可视化库 |
1.1 回归
sklearn中所有内置数据集都封装在datasets对象内: 返回的对象有:
- data:特征X的矩阵(ndarray)
- target:因变量的向量(ndarray)
- feature_names:特征名称(ndarray)
from sklearn import datasets
boston = datasets.load_boston() #返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X, columns=features) #将X转换为DataFrame表形式,并将列名命名为特证名
boston_data['Price'] = y #将因变量列加入数据表
boston_data.head()
#可视化
sns.scatterplot(boston_data['NOX'], boston_data['Price'], color='r', alpha=0.6)
plt.title("Price~NOX")
plt.show()
显示数据如下:
各个特征的相关解释:
- CRIM:各城镇的人均犯罪率
- ZN:规划地段超过25,000平方英尺的住宅用地比例
- INDUS:城镇非零售商业用地比例
- CHAS:是否在查尔斯河边(=1是)
- NOX:一氧化氮浓度(/千万分之一)
- RM:每个住宅的平均房间数
- AGE:1940年以前建造的自住房屋的比例
- DIS:到波士顿五个就业中心的加权距离
- RAD:放射状公路的可达性指数
- TAX:全部价值的房产税率(每1万美元)
- PTRATIO:按城镇分配的学生与教师比例
- B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
- LSTAT:较低地位人口
- Price:房价
可视化结果:
1.2 分类
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
iris_data = pd.DataFrame(X, columns=features)
iris_data['target'] = y
iris_data.head()
#可视化
'''
enumerate():对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
np.unique():该函数是去除数组中的重复数字,并进行排序之后输出。
'''
for index,c in enumerate(np.unique(y)):
plt.scatter(x=iris_data.loc[y==c, "sepal length (cm)"], y=iris_data.loc[y==c, "sepal width (cm)"])
plt.xlabel("sepal length(cm)")
plt.ylabel("sepal width(cm)")
plt.legend(labels = [1,2,3])
plt.show()
显示数据如下:
各个特征的相关解释:
- sepal length (cm):花萼长度(厘米)
- sepal width (cm):花萼宽度(厘米)
- petal length (cm):花瓣长度(厘米)
- petal width (cm):花瓣宽度(厘米)
可视化结果:
1.3 无监督学习
我们可以使用sklearn生成符合自身需求的数据集。
#生成月牙形非凸集
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.05,random_state=None)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1], s=7)
plt.show()
#生成符合正态分布的聚类数据
from sklearn import datasets
x ,y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1], s=7)
plt.show()