赞
踩
- !pip install -q hvplot
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- import seaborn as sns
- import hvplot.pandas
-
- %matplotlib inline
-
- # sns.set_style("whitegrid")
- # plt.style.use("fivethirtyeight")
- USAhousing = pd.read_csv('/kaggle/input/usa-housing/USA_Housing.csv')
- #用来展示两两特征之间的关系
- sns.pairplot(USAhousing)
- USAhousing.hvplot.hist(by='Price', subplots=False, width=1000)
- USAhousing.hvplot.hist("Price")
USAhousing.hvplot.scatter(x='Avg. Area House Age', y='Price')
USAhousing.hvplot.scatter(x='Avg. Area Income', y='Price')
sns.heatmap(USAhousing.corr(), annot=True)
- X = USAhousing[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
- 'Avg. Area Number of Bedrooms', 'Area Population']]
- y = USAhousing['Price']
- #Train Test Split
- from sklearn.model_selection import train_test_split
-
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
-
- from sklearn import metrics
- from sklearn.model_selection import cross_val_score
-
- def cross_val(model):
- #cv折数
- pred = cross_val_score(model, X, y, cv=10)
- return pred.mean()
-
- def print_evaluate(true, predicted):
- mae = metrics.mean_absolute_error(true, predicted)
- mse = metrics.mean_squared_error(true, predicted)
- rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
- r2_square = metrics.r2_score(true, predicted)
- print('MAE:', mae)
- print('MSE:', mse)
- print('RMSE:', rmse)
- print('R2 Square', r2_square)
- print('__________________________________')
-
- def evaluate(true, predicted):
- mae = metrics.mean_absolute_error(true, predicted)
- mse = metrics.mean_squared_error(true, predicted)
- rmse = np.sqrt(metrics.mean_squared_error(true, predicted))
- r2_square = metrics.r2_score(true, predicted)
- return mae, mse, rmse, r2_square
- from sklearn.preprocessing import StandardScaler
- from sklearn.pipeline import Pipeline
-
- pipeline = Pipeline([
- ('std_scalar', StandardScaler())
- ])
-
- X_train = pipeline.fit_transform(X_train)
- X_test = pipeline.transform(X_test)
Pipeline管道机制在机器学习算法中得以应用的根源在于,参数集在新数据集(比如测试集)上的重复使用。
管道机制实现了对全部步骤的流式化封装和管理(streaming workflows with pipelines)。
可放在Pipeline中的步骤可能有:
特征标准化是需要的,可作为第一个环节
既然是分类器,classifier也是少不了的,自然是最后一个环节
中间可加上比如数据降维(PCA)
引用:http://t.csdnimg.cn/4Nqc8http://t.csdnimg.cn/4Nqc8
数据标准化是一个常用的数据预处理操作,目的是处理不同规模和量纲的数据,使其缩放到相同的数据区间和范围,以减少规模、特征、分布差异等对模型的影响。
比如线性回归模型、逻辑回归模型或包含矩阵的模型,它们会受到输入尺度(量纲)的影响。相反,那些基于树的模型则根本不在乎输入尺度(量纲)有多大。
引用:http://t.csdnimg.cn/TWBSNhttp://t.csdnimg.cn/TWBSN
fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。
根据对之前部分trainData进行fit的整体指标,对剩余的数据(testData)使用同样的均值、方差、最大最小值等指标进行转换transform(testData),从而保证train、test处理方式相同。所以,一般都是这么用:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)
Note:
必须先用fit_transform(trainData),之后再transform(testData)
如果直接transform(testData),程序会报错
如果fit_transfrom(trainData)后,使用fit_transform(testData)而不transform(testData),虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异。(一定要避免这种情况)
引用:http://t.csdnimg.cn/ofTjjhttp://t.csdnimg.cn/ofTjj
- from sklearn.linear_model import LinearRegression
-
- lin_reg = LinearRegression()
- lin_reg.fit(X_train,y_train)
- #输出截距
- print(lin_reg.intercept_)
- #输出各自变量系数
- coeff_df = pd.DataFrame(lin_reg.coef_, X.columns, columns=['Coefficient'])
- coeff_df
- #预测
- pred = lin_reg.predict(X_test)
- #绘图
- pd.DataFrame({'True Values': y_test, 'Predicted Values': pred}).hvplot.scatter(x='True Values', y='Predicted Values')
- #残差直方图
- pd.DataFrame({'Error Values': (y_test - pred)}).hvplot.kde()
- #输出回归评价指标
- test_pred = lin_reg.predict(X_test)
- train_pred = lin_reg.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df = pd.DataFrame(data=[["Linear Regression", *evaluate(y_test, test_pred) , cross_val(LinearRegression())]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])
稳健回归(Robust regression),就是当最小二乘法遇到上述的,数据样本点存在异常点的时候,用于代替最小二乘法的一个算法。当然,稳健回归还可以用于异常点检测,或者是找出那些对模型影响最大的样本点。
RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Proble)问题的。
对于RANSAC算法来说一个基本的假设就是数据是由“内点”和“外点”组成的。“内点”就是组成模型参数的数据,“外点”就是不适合模型的数据。同时RANSAC假设:在给定一组含有少部分“内点”的数据,存在一个程序可以估计出符合“内点”的模型。
- from sklearn.linear_model import RANSACRegressor
-
- model = RANSACRegressor(base_estimator=LinearRegression(), max_trials=100)
- model.fit(X_train, y_train)
-
- test_pred = model.predict(X_test)
- train_pred = model.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Robust Regression", *evaluate(y_test, test_pred) , cross_val(RANSACRegressor())]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])
- results_df = results_df.append(results_df_2, ignore_index=True)
多重共线性2(Multicollinearity)是指多变量线性回归中,变量之间由于存在精确相关关系或高度相关关系而使回归估计不准确。
多重共线性的问题既然是自变量之间存在相关关系,其中一个解决方法就是剔除掉共线的自变量,可以通过计算方差扩大因子5(Variance inflation factor,VIF)来量化自变量之间的相关关系,方差扩大因子越大说明自变量的共线性越严重。
另一种方式是通过对代价函数正则化加入惩罚项来解决,其中一种正则化方式被称为吉洪诺夫正则化(Tikhonov regularization),这种代价函数正则化后的线性回归被称为岭回归(Ridge Regression)。
岭回归的代价函数第一项与标准线性回归的一致,都是欧几里得距离的平方和,只是在后面加上了一个 w 向量的 L2-范数6 的平方作为惩罚项(L2-范数的含义为向量 W 每个元素的平方和然后开平方),其中 λ 表示惩罚项的系数,人为的控制惩罚项的大小。由于正则项是 L2-范数,有时这种正则化方式也被称为 L2 正则化。
http://t.csdnimg.cn/zZjIlhttp://t.csdnimg.cn/zZjIl对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。通常岭回归方程的R平方值会稍低于普通回归分析,但回归系数的显著性往往明显高于普通回归,在存在共线性问题和病态数据偏多的研究中有较大的实用价值。
- from sklearn.linear_model import Ridge
-
- model = Ridge(alpha=100, solver='cholesky', tol=0.0001, random_state=42)
- model.fit(X_train, y_train)
- pred = model.predict(X_test)
-
- test_pred = model.predict(X_test)
- train_pred = model.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Ridge Regression", *evaluate(y_test, test_pred) , cross_val(Ridge())]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])
- results_df = results_df.append(results_df_2, ignore_index=True)
- from sklearn.linear_model import Lasso
-
- model = Lasso(alpha=0.1,
- precompute=True,
- # warm_start=True,
- positive=True,
- selection='random',
- random_state=42)
- model.fit(X_train, y_train)
-
- test_pred = model.predict(X_test)
- train_pred = model.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Lasso Regression", *evaluate(y_test, test_pred) , cross_val(Lasso())]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])
- results_df = results_df.append(results_df_2, ignore_index=True)
前面学习了岭回归与 Lasso 回归两种正则化的方法,当多个特征存在相关时,Lasso 回归可能只会随机选择其中一个,岭回归则会选择所有的特征。这时很容易的想到如果将这两种正则化的方法结合起来,就能够集合两种方法的优势,这种正则化后的算法就被称为弹性网络回归(Elastic Net Regression)。
弹性网络回归算法的代价函数结合了 Lasso 回归和岭回归的正则化方法,通过两个参数 λ 和 ρ 来控制惩罚项的大小。
可以看到,当 ρ = 0 时,其代价函数就等同于岭回归的代价函数,当 ρ = 1 时,其代价函数就等同于 Lasso 回归的代价函数。与 Lasso 回归一样代价函数中有绝对值存在,不是处处可导的,所以就没办法通过直接求导的方式来直接得到 w 的解析解,不过还是可以用坐标下降法(coordinate descent)来求解 w。
http://t.csdnimg.cn/YTv2thttp://t.csdnimg.cn/YTv2t
- from sklearn.linear_model import ElasticNet
-
- model = ElasticNet(alpha=0.1, l1_ratio=0.9, selection='random', random_state=42)
- model.fit(X_train, y_train)
-
- test_pred = model.predict(X_test)
- train_pred = model.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Elastic Net Regression", *evaluate(y_test, test_pred) , cross_val(ElasticNet())]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])
- results_df = results_df.append(results_df_2, ignore_index=True)
多项式回归算法(Polynomial Regression)属于有监督的回归(Regression)学习算法。很多场合线性模型无法很好的拟合目标数据曲线,这就需要引入非线性回归模型。
多项式回归的主要思想就是通过历史数据拟合出多项式回归的方程,并利用多项式回归的方程对新的数据进行预测。多项式回归的方程如下:
从上式可以得出:要想获得一个与目标数据集完美拟合的多项式回归模型,实质就是求解出每个特征自变量的权值θ。
- from sklearn.preprocessing import PolynomialFeatures
-
- poly_reg = PolynomialFeatures(degree=2)
-
- X_train_2_d = poly_reg.fit_transform(X_train)
- X_test_2_d = poly_reg.transform(X_test)
-
- lin_reg = LinearRegression(normalize=True)
- lin_reg.fit(X_train_2_d,y_train)
-
- test_pred = lin_reg.predict(X_test_2_d)
- train_pred = lin_reg.predict(X_train_2_d)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Polynomail Regression", *evaluate(y_test, test_pred), 0]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])
- results_df = results_df.append(results_df_2, ignore_index=True)
SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。(重点:每次迭代使用一组样本。)
为什么叫随机梯度下降算法呢?这里的随机是指每次迭代过程中,样本都要被随机打乱,这个也很容易理解,打乱是有效减小样本之间造成的参数更新抵消问题。
对于权值的更新不再通过遍历全部的数据集,而是选择其中的一个样本即可。一般来说其步长的选择比梯度下降法的步长要小一点,因为梯度下降法使用的 是准确梯度,所以它可以朝着全局最优解(当问题为凸问题时)较大幅度的迭代下去,但是随机梯度法不行,因为它使用的是 近似梯度,或者对于全局来说有时候它走的也许根本不是梯度下降的方向,故而它走的比较缓,同样这样带来的好处就是相比于梯度下降法,它不是那么容易陷入到局部最优解中去。
http://t.csdnimg.cn/e04Z4http://t.csdnimg.cn/e04Z4
- from sklearn.linear_model import SGDRegressor
-
- sgd_reg = SGDRegressor(n_iter_no_change=250, penalty=None, eta0=0.0001, max_iter=100000)
- sgd_reg.fit(X_train, y_train)
-
- test_pred = sgd_reg.predict(X_test)
- train_pred = sgd_reg.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
- print('====================================')
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Stochastic Gradient Descent", *evaluate(y_test, test_pred), 0]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])
- results_df = results_df.append(results_df_2, ignore_index=True)
- from tensorflow.keras.models import Sequential
- from tensorflow.keras.layers import Input, Dense, Activation, Dropout
- from tensorflow.keras.optimizers import Adam
-
- X_train = np.array(X_train)
- X_test = np.array(X_test)
- y_train = np.array(y_train)
- y_test = np.array(y_test)
- #Sequential模型字面上的翻译是顺序模型,给人的第一感觉是那种简单的线性模型,但实际上Sequential模型可以构建非常复杂的神经网络,包括全连接神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、等等。这里的Sequential更准确的应该理解为堆叠,通过堆叠许多层,构建出深度神经网络。
- #这里其实是Sequential的第三种实现
- model = Sequential()
-
- model.add(Dense(X_train.shape[1], activation='relu'))
- model.add(Dense(32, activation='relu'))
- # model.add(Dropout(0.2))
-
- model.add(Dense(64, activation='relu'))
- # model.add(Dropout(0.2))
-
- model.add(Dense(128, activation='relu'))
- # model.add(Dropout(0.2))
-
- model.add(Dense(512, activation='relu'))
- model.add(Dropout(0.1))
- model.add(Dense(1))
-
- model.compile(optimizer=Adam(0.00001), loss='mse')
- #model.fit( )函数将训练数据在模型中训练一定次数,返回loss和测量指标,返回一个History的对象,即记录了loss和其他指标的数值随epoch变化的情况。
- r = model.fit(X_train, y_train,
- validation_data=(X_test,y_test),
- batch_size=1,
- epochs=100)
pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型 :
http://t.csdnimg.cn/11EeJhttp://t.csdnimg.cn/11EeJ神经网络的Dropout正则化:
http://t.csdnimg.cn/z0yyNhttp://t.csdnimg.cn/z0yyN如何确定神经网络的层数和隐藏层神经元数量:
如何确定神经网络的层数和隐藏层神经元数量 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/100419971深入理解 keras 中 Dense 层参数:
http://t.csdnimg.cn/gFPJOhttp://t.csdnimg.cn/gFPJO
pd.DataFrame({'True Values': y_test, 'Predicted Values': pred}).hvplot.scatter(x='True Values', y='Predicted Values')
pd.DataFrame(r.history)
pd.DataFrame(r.history).hvplot.line(y=['loss', 'val_loss'])
- test_pred = model.predict(X_test)
- train_pred = model.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
-
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Artficial Neural Network", *evaluate(y_test, test_pred), 0]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])
- results_df = results_df.append(results_df_2, ignore_index=True)
相关介绍可看这篇文章:
http://t.csdnimg.cn/NhAJrhttp://t.csdnimg.cn/NhAJr
- from sklearn.ensemble import RandomForestRegressor
-
- rf_reg = RandomForestRegressor(n_estimators=1000)
- rf_reg.fit(X_train, y_train)
-
- test_pred = rf_reg.predict(X_test)
- train_pred = rf_reg.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
-
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["Random Forest Regressor", *evaluate(y_test, test_pred), 0]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])
- results_df = results_df.append(results_df_2, ignore_index=True)
SVM的全称是Support Vector Machine,即支持向量机,主要用于解决模式识别领域中的数据分类问题,属于有监督学习算法的一种。SVM要解决的问题可以用一个经典的二分类问题加以描述。如图1所示,红色和蓝色的二维数据点显然是可以被一条直线分开的,在模式识别领域称为线性可分问题。然而将两类数据点分开的直线显然不止一条。图1(b)和(c)分别给出了A、B两种不同的分类方案,其中黑色实线为分界线,术语称为“决策面”。每个决策面对应了一个线性分类器。虽然在目前的数据上看,这两个分类器的分类结果是一样的,但如果考虑潜在的其他数据,则两者的分类性能是有差别的。
SVM算法认为图1中的分类器A在性能上优于分类器B,其依据是A的分类间隔比B要大。这里涉及到第一个SVM独有的概念“分类间隔”。在保证决策面方向不变且不会出现错分样本的情况下移动决策面,会在原来的决策面两侧找到两个极限位置(越过该位置就会产生错分现象),如虚线所示。虚线的位置由决策面的方向和距离原决策面最近的几个样本的位置决定。而这两条平行虚线正中间的分界线就是在保持当前决策面方向不变的前提下的最优决策面。两条虚线之间的垂直距离就是这个最优决策面对应的分类间隔。显然每一个可能把数据集正确分开的方向都有一个最优决策面(有些方向无论如何移动决策面的位置也不可能将两类样本完全分开),而不同方向的最优决策面的分类间隔通常是不同的,那个具有“最大间隔”的决策面就是SVM要寻找的最优解。而这个真正的最优解对应的两侧虚线所穿过的样本点,就是SVM中的支持样本点,称为“支持向量”。对于图1中的数据,A决策面就是SVM寻找的最优解,而相应的三个位于虚线上的样本点在坐标系中对应的向量就叫做支持向量。
从表面上看,我们优化的对象似乎是这个决策面的方向和位置。但实际上最优决策面的方向和位置完全取决于选择哪些样本作为支持向量。而在经过漫长的公式推导后,你最终会发现,其实与线性决策面的方向和位置直接相关的参数都会被约减掉,最终结果只取决于样本点的选择结果。
到这里,我们明确了SVM算法要解决的是一个最优分类器的设计问题。既然叫作最优分类器,其本质必然是个最优化问题。所以,接下来我们要讨论的就是如何把SVM变成用数学语言描述的最优化问题模型,这就是我们在第二部分要讲的“线性SVM算法的数学建模”。
零基础学SVM—Support Vector Machine(一) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/24638007
- from sklearn.svm import SVR
-
- svm_reg = SVR(kernel='rbf', C=1000000, epsilon=0.001)
- svm_reg.fit(X_train, y_train)
-
- test_pred = svm_reg.predict(X_test)
- train_pred = svm_reg.predict(X_train)
-
- print('Test set evaluation:\n_____________________________________')
- print_evaluate(y_test, test_pred)
-
- print('Train set evaluation:\n_____________________________________')
- print_evaluate(y_train, train_pred)
-
- results_df_2 = pd.DataFrame(data=[["SVM Regressor", *evaluate(y_test, test_pred), 0]],
- columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])
- results_df = results_df.append(results_df_2, ignore_index=True)
- results_df.set_index('Model', inplace=True)
- results_df['R2 Square'].plot(kind='barh', figsize=(12, 8))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。