機器學習接口和代碼之 線性回歸

線性回歸sklearn 接口和代碼

官網api:https://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares

LinearRegression

class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)參數說明:fit_intercept:bool,選擇是否需要計算截距,默認為True,如果中心化了的數據可以選擇falsenormalize:bool,選擇是否需要標準化(在回歸之前,對X減去平均值再除以二范數),默認為false,如果fit_intercept被設置為False時,該參數將忽略。在這里還是建議將標準化的工作放在訓練模型之前。通過設置sklearn.preprocessing.StandardScaler來實現,而在此處設置為falsecopy_x:bool量,選擇是否復制X數據,默認True,如果不復制數據,數據在運行過程中修改,不會覆蓋原始數據,如果否,可能會因為中心化把X數據覆蓋n_job:int量,選擇幾核用于計算,默認1,-1表示全速運行# 其實這里面的參數基本都不怎么需要涉及,往往默認參數就夠用。可用屬性:coef_:訓練后的輸入端模型系數,如果label有兩個,即y值有兩列。那么是一個2D的arrayintercept_: 截距

可用的methods

fit

fit(X,y,sample_weight=None):?
參數:X: array, 稀疏矩陣 [n_samples,n_features]?y: array [n_samples, n_targets]?sample_weight: 權重,形狀為[n_samples]的numpy數組?---------在版本0.17后添加了sample_weight

get_params(deep=True)

?返回對regressor 的設置值

predict(X)

?預測 基于 R^2值

score

評估

案例一:自己實現線性回歸,用最小二乘

# -*- coding:utf-8 -*-from sklearn.model_selection import train_test_split # 數據劃分的類
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd# 設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False# 加載數據
# 日期、時間、有功功率、無功功率、電壓、電流、廚房用電功率、洗衣服用電功率、熱水器用電功率
path1='/datas/household_power_consumption_1000.txt'
df = pd.read_csv(path1, sep=';', low_memory=False)  # 沒有混合類型的時候可以通過low_memory=F調用更多內存,加快效率)
print(df)## 功率和電流之間的關系
X = df.iloc[:,2:4]
Y = df.iloc[:,5]## 數據分割
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 將X和Y轉換為矩陣的形式
X = np.mat(X2_train)
Y = np.mat(Y2_train).reshape(-1,1)# 計算θ
theta = (X.T * X).I * X.T * Y
print(theta)# 對測試集合進行測試
y_hat = np.mat(X2_test) * theta# 畫圖
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真實值')
plt.plot(t, y_hat, 'g-', linewidth=2, label=u'預測值')
plt.legend(loc = 'lower right')
plt.title(u"線性回歸預測功率與電流之間的關系", fontsize=20)
plt.grid(b=True)
plt.show()

案例二:家庭用電預測:線性回歸算法(時間與功率&功率與電流之間的關系)

from sklearn.model_selection import train_test_split  # 數據劃分的類
from sklearn.linear_model import LinearRegression  # 線性回歸的類
from sklearn.preprocessing import StandardScaler  # 數據標準化import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd# 設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False# 加載數據
# 日期、時間、有功功率、無功功率、電壓、電流、廚房用電功率、洗衣服用電功率、熱水器用電功率
path1='datas/household_power_consumption_1000.txt'
df = pd.read_csv(path1, sep=';', low_memory=False)  # 沒有混合類型的時候可以通過low_memory=F調用更多內存,加快效率)
print(df.head())  # 獲取前五行數據
print(df.info())# 異常數據處理(異常數據過濾)
new_df = df.replace('?', np.nan)  # 替換非法字符為np.nan
datas = new_df.dropna(axis=0, how = 'any')  # 只要有一個數據為空,就進行行刪除操作
print(datas.describe().T)  # 觀察數據的多種統計指標(只能看數值型的)
print(df.info())  # 查看格式信息# 創建一個時間函數格式化字符串
def date_format(dt):# dt顯示是一個series/tuple;dt[0]是date,dt[1]是timeimport timet = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)# 需求:構建時間和功率之間的映射關系,可以認為:特征屬性為時間;目標屬性為功率值。
# 獲取x和y變量, 并將時間轉換為數值型連續變量
X = datas.iloc[:, 0:2]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas['Global_active_power']print(X.head(2))# 對數據集進行測試集合訓練集劃分
# X:特征矩陣(類型一般是DataFrame)
# Y:特征對應的Label標簽(類型一般是Series)
# test_size: 對X/Y進行劃分的時候,測試集合的數據占比, 是一個(0,1)之間的float類型的值
# random_state: 數據分割是基于隨機器進行分割的,該參數給定隨機數種子;給一個值(int類型)的作用就是保證每次分割所產生的數數據集是完全相同的
X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)# 查看訓練集上的數據信息(X)
print(X_train.describe())# 數據標準化
# StandardScaler:將數據轉換為標準差為1的數據集(有一個數據的映射)
# scikit-learn中:如果一個API名字有fit,那么就有模型訓練的含義,沒法返回值
# scikit-learn中:如果一個API名字中有transform, 那么就表示對數據具有轉換的含義操作
# scikit-learn中:如果一個API名字中有predict,那么就表示進行數據預測,會有一個預測結果輸出
# scikit-learn中:如果一個API名字中既有fit又有transform的情況下,那就是兩者的結合(先做fit,再做transform)
ss = StandardScaler()  # 模型對象創建
X_train = ss.fit_transform(X_train)  # 訓練模型并轉換訓練集
X_test = ss.transform(X_test)  # 直接使用在模型構建數據上進行一個數據標準化操作 (測試集)print(pd.DataFrame(X_train).describe())# 模型訓練
lr = LinearRegression(fit_intercept=True)  # 模型對象構建
lr.fit(X_train, Y_train)  # 訓練模型# 模型預測
y_predict = lr.predict(X_test)  # 預測結果print("訓練集上R2:", lr.score(X_train, Y_train))
print("測試集上R2:", lr.score(X_test, Y_test))
mse = np.average((y_predict-Y_test)**2)  # 開根號
rmse = np.sqrt(mse)
print("rmse:", rmse)# 輸出模型訓練得到的相關參數
print("模型的系數(θ):", end="")
print(lr.coef_)
print("模型的截距:", end='')
print(lr.intercept_)# 模型保存/持久化
# 在機器學習部署的時候,實際上其中一種方式就是將模型進行輸出;另外一種方式就是直接將預測結果輸出
# 模型輸出一般是將模型輸出到磁盤文件
from sklearn.externals import joblib# 保存模型要求給定的文件所在的文件夾比較存在
joblib.dump(ss, "result/data_ss.model")  # 將標準化模型保存
joblib.dump(lr, "result/data_lr.model")  # 將模型保存# 加載模型
ss3 = joblib.load("result/data_ss.model")  # 加載模型
lr3 = joblib.load("result/data_lr.model")  # 加載模型# 使用加載的模型進行預測
data1 = [[2006, 12, 17, 12, 25, 0]]
data1 = ss3.transform(data1)
print(data1)
lr3.predict(data1)# 預測值和實際值畫圖比較
t=np.arange(len(X_test))
plt.figure(facecolor='w')  # 建一個畫布,facecolor是背景色
plt.plot(t, Y_test, 'r-', linewidth=2, label='真實值')
plt.plot(t, y_predict, 'g-', linewidth=2, label='預測值')
plt.legend(loc = 'upper left')  # 顯示圖例,設置圖例的位置
plt.title("線性回歸預測時間和功率之間的關系", fontsize=20)
plt.grid(b=True)  # 加網格
plt.show()# 功率和電流之間的關系
X = datas.iloc[:,2:4]
Y2 = datas.iloc[:,5]# 數據分割
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y2, test_size=0.2, random_state=0)# 數據歸一化
scaler2 = StandardScaler()
X2_train = scaler2.fit_transform(X2_train)  # 訓練并轉換
X2_test = scaler2.transform(X2_test)  # 直接使用在模型構建數據上進行一個數據標準化操作# 模型訓練
lr2 = LinearRegression()
lr2.fit(X2_train, Y2_train)# 結果預測
Y2_predict = lr2.predict(X2_test)# 模型評估
print("電流預測準確率: ", lr2.score(X2_test, Y2_test))
print("電流參數:", lr2.coef_)# 繪制圖表
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真實值')
plt.plot(t, Y2_predict, 'g-', linewidth=2, label=u'預測值')
plt.legend(loc = 'lower right')
plt.title(u"線性回歸預測功率與電流之間的關系", fontsize=20)
plt.grid(b=True)
plt.show()

案例三:家庭用電預測:線性回歸算法(時間與電壓的多項式關系)

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipelineimport numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd# 創建一個時間字符串格式化字符串
def date_format(dt):import timet = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)# 設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False# 加載數據
path = 'datas\household_power_consumption_200.txt'  ## 200行數據
path = 'datas\household_power_consumption_1000.txt'  ## 1000行數據
df = pd.read_csv(path, sep=';', low_memory=False)# 日期、時間、有功功率、無功功率、電壓、電流、廚房用電功率、洗衣服用電功率、熱水器用電功率
names2 = df.columns
names = ['Date', 'Time', 'Global_active_power', 'Global_reactive_power', 'Voltage', 'Global_intensity','Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']# 異常數據處理(異常數據過濾)
new_df = df.replace('?', np.nan)
datas = new_df.dropna(axis=0, how='any')  # 只要有數據為空,就進行刪除操作# 時間和電壓之間的關系(Linear)
# 獲取x和y變量, 并將時間轉換為數值型連續變量
X = datas[names[0:2]]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas[names[4]].values# 對數據集進行測試集合訓練集劃分
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 數據標準化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)  # 訓練并轉換
X_test = ss.transform(X_test)  # 直接使用在模型構建數據上進行一個數據標準化操作# 模型訓練
lr = LinearRegression()
lr.fit(X_train, Y_train)  # 訓練模型# 模型預測
y_predict = lr.predict(X_test)# 模型效果
print("準確率:", lr.score(X_test, Y_test))# 預測值和實際值畫圖比較
t = np.arange(len(X_test))
plt.figure(facecolor='w')
plt.plot(t, Y_test, 'r-', linewidth=2, label=u'真實值')
plt.plot(t, y_predict, 'g-', linewidth=2, label=u'預測值')
plt.legend(loc='lower right')
plt.title(u"線性回歸預測時間和功率之間的關系", fontsize=20)
plt.grid(b=True)  # 網格
plt.show()# 時間和電壓之間的關系(Linear-多項式)
# Pipeline:管道的意思,講多個操作合并成為一個操作
# Pipleline總可以給定多個不同的操作,給定每個不同操作的名稱即可,執行的時候,按照從前到后的順序執行
# Pipleline對象在執行的過程中,當調用某個方法的時候,會調用對應過程的對應對象的對應方法
# eg:在下面這個案例中,調用了fit方法,
# 那么對數據調用第一步操作:PolynomialFeatures的fit_transform方法對數據進行轉換并構建模型
# 然后對轉換之后的數據調用第二步操作: LinearRegression的fit方法構建模型
# eg: 在下面這個案例中,調用了predict方法,
# 那么對數據調用第一步操作:PolynomialFeatures的transform方法對數據進行轉換
# 然后對轉換之后的數據調用第二步操作: LinearRegression的predict方法進行預測
models = [Pipeline([('Poly', PolynomialFeatures()),  # 給定進行多項式擴展操作, 第一個操作:多項式擴展('Linear', LinearRegression(fit_intercept=False))  # 第二個操作,線性回歸])
]
model = models[0]
# 獲取x和y變量, 并將時間轉換為數值型連續變量
X = datas[names[0:2]]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas[names[4]]# 對數據集進行測試集合訓練集劃分
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 數據標準化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)  # 訓練并轉換
X_test = ss.transform(X_test)  # 直接使用在模型構建數據上進行一個數據標準化操作# 模型訓練
t = np.arange(len(X_test))
N = 5
d_pool = np.arange(1, N, 1)  # 階
m = d_pool.size
clrs = []  # 顏色
for c in np.linspace(16711680, 255, m):clrs.append('#%06x' % int(c))
line_width = 3plt.figure(figsize=(12, 6), facecolor='w')  # 創建一個繪圖窗口,設置大小,設置顏色
for i, d in enumerate(d_pool):plt.subplot(N - 1, 1, i + 1)plt.plot(t, Y_test, 'r-', label=u'真實值', ms=10, zorder=N)# 設置管道對象中的參數值,Poly是在管道對象中定義的操作名稱, 后面跟參數名稱;中間是兩個下劃線model.set_params(Poly__degree=d)  # 設置多項式的階乘model.fit(X_train, Y_train)  # 模型訓練# Linear是管道中定義的操作名稱# 獲取線性回歸算法模型對象lin = model.get_params()['Linear']output = u'%d階,系數為:' % d# 判斷lin對象中是否有對應的屬性if hasattr(lin, 'alpha_'):idx = output.find(u'系數')output = output[:idx] + (u'alpha=%.6f, ' % lin.alpha_) + output[idx:]if hasattr(lin, 'l1_ratio_'):idx = output.find(u'系數')output = output[:idx] + (u'l1_ratio=%.6f, ' % lin.l1_ratio_) + output[idx:]print(output, lin.coef_.ravel())# 模型結果預測y_hat = model.predict(X_test)# 計算評估值s = model.score(X_test, Y_test)# 畫圖z = N - 1 if (d == 2) else 0label = u'%d階, 準確率=%.3f' % (d, s)plt.plot(t, y_hat, color=clrs[i], lw=line_width, alpha=0.75, label=label, zorder=z)plt.legend(loc='upper left')plt.grid(True)plt.ylabel(u'%d階結果' % d, fontsize=12)# 預測值和實際值畫圖比較
plt.suptitle(u"線性回歸預測時間和功率之間的多項式關系", fontsize=20)
plt.grid(b=True)
plt.show()

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國智慧VS西方智慧-看中國IT風云與IT產業怪狀

為什么國外沒有一家互聯網公司在中國取得成功,為什么他們都水土不服,為什么他們都在中國都混不下去,YAHOO, EBAY等等這樣享譽全球的互聯網公司都在中國無法取得成功!為什么連讓IT巨無霸微軟都覺得發抖,讓比爾蓋茨夜夜做…

商務搜索引擎_外貿研修 | 世界各國常用搜索引擎,開發客戶必備!

我們平時生活中也好,開發客戶也好,搜索引擎是我們離不開的工具。最佳沒有之一的當屬谷歌了。谷歌網址:www.google.com谷歌高級搜索:https://www.google.com/advanced_search (通過設置/排除一些字詞縮小精確搜索范圍)作為普通使用…

HaProxy+Keepalived+Mycat高可用群集配置

概述 本章節主要介紹配置HaProxyKeepalived高可用群集,Mycat的配置就不在這里做介紹,可以參考我前面寫的幾篇關于Mycat的文章。 部署圖: 配置 HaProxy安裝 181和179兩臺服務器安裝haproxy的步驟一致 --創建haproxy用戶 useradd haproxy--…

奇怪的bug,不懂Atom在添加markdown-themeable-pdf,在配置好phantomjs的情況下報錯

本來打算用一下atom但是導出pdf報錯,可是在預覽的情況下就沒有問題,順便吐槽一下谷歌瀏覽器自己的markdown在線預覽插件無法適配,用搜狗搭載谷歌的插件才能導出pdf,一下感覺逼格少了很多,等忙完這陣再來看一下。先貼出…

機器學習之 sklearn.preprocessing 模塊

sklearn.preprocessing.PolynomialFeatures 多項式擴展。 它是使用多項式的方法來進行的,如果有a,b兩個特征,那么它的2次多項式為(1,a,b,a^2,ab, b^2),這個多項式的形式是使用poly的效果。 api class s…

Python 面試題

Python面試315道題第一部 Python面試題基礎篇(80道)1、為什么學習Python?2、通過什么途徑學習的Python?3、Python和Java、PHP、C、C#、C等其他語言的對比?PHPjavacc#c4、簡述解釋型和編譯型編程語言?編譯型…

周鴻祎,高司令

還是感到有必要將自己的一些想法快速記下來。 首先是對周鴻祎新員工演講的看法。 就說實話這一點來說,周鴻祎比很多人強。所以我比較喜歡引用他的話,確實比較實在,不裝逼。 至于一個公司招人的風格,是公司自己定的,別人…

JDBC與JNDI應用比較

JNDI用了多年但是一直沒去弄懂其和JDBC的區別,今天在網上搜了下,發下些資料說明的還不錯記錄下。 JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規范中是重要的規范之一,不少專…

bzoj1038500AC!

序列dp 先開始想了一個類似區間dp的東西...少了一維 然后發現似乎不太對,因為女生的最大差和男生的最大差并不相等 dp[i][j][x][y]表示當前有i個人,j個男生,男生和女生的后綴最大差是x,女生和男生最大差是y,x,y>0,轉…

機器學習接口代碼之 Ridge、Lasso、Elasitc Net

目錄 Ridge Regression (嶺回歸) Lasso Regression Elasitc Net(彈性網絡) 案例:葡萄酒質量預測 官網地址https://scikit-learn.org/stable/modules/linear_model.html Ridge Regression (嶺回歸&…

公司技術管理角度看C++游戲程序員發展

公司技術管理角度看C游戲程序員發展 H3D 這是我多年來招聘培訓游戲程序員的一點想法。一直想匯總一下。主要目的是為了更好的對公司新進C程序員進行培訓,并且建立起游戲程序員培訓,發展,成才,成為核心骨干,管理層&am…

android生命周期_Android開發 View的生命周期結合代碼詳解

咱們以TextView控件為例:/*** Created by SunshineBoy on 2020/9/23.*/public class TestTextView extends android.support.v7.widget.AppCompatTextView {public TestTextView(Context context) {super(context);Log.e("TestTextView","TestTextVi…

salt

安裝服務端和客戶端服務端(marster)yum install salt-master -y客戶端(slave)yum install salt-minion -ymarster192.168.11.17/etc/init.d/salt-master start配置文件: vi /etc/salt/mastercat master|egrep -v ;|#|^$auto_accept:True #設置自動接受日志: /var/log/salt/mas…

python | 查看pip支持的文件名和版本

python | 查看pip支持的文件名和版本win下查詢大哥推薦已經解決win下查詢 import pip._internalprint(pip._internal.pep425tags.get_supported())64位的需要在pip后面加個_internal 如果不行試試下邊的 大哥推薦已經解決 import wheel.pep425tags as w print(w.get_suppor…

機器學習算法之支持向量機 SVM

距離知識 點到直線/平面的距離公式: 1、假定點p(x0,y0),平面方程為f(x,y)AxByC,那么點p到平面f(x)的距離為: 2、從三維空間擴展到多維空間中,如果存在一個超平面f(X)θXb; 那么某一個點X0到這個超平面的距離為: 參考…

set IDENTITY_INSERT on 和 off 的設置

批量插入記錄時,對有標識列的字段要設置 set IDENTITY_INSERT 表名 on,然后再執行插入記錄操作;插入完畢后恢復為 off 設置 轉載于:https://www.cnblogs.com/TTonly/p/10349931.html

VMware Horizon虛擬桌面工具箱2.0-審計,遠程協助,控制臺,電源

各位朋友,大家好,VMware Horizon 虛擬桌面工具箱2.0版本,已經面世啦!在2.0 版本中我們添加了vSphere虛擬機控制臺訪問、開機策略和圖形化安裝這三個新功能,并改進了部分老的功能。老版本即1.5版本的相關知識可以參考我的博文VMware Horizon虛擬桌面工具箱之審計與遠…

python詞云改顏色_一種用Python生成詞云

一種用Python生成詞云 我們在閱讀一篇很長的文章時,總先看看文章的關鍵詞來獲知文章的大概內容。今天我們就來制作一個詞云程序,將文章中出現次數較多的詞語提取出來,生成一張詞云圖。詞云圖的生成原理: 程序會將這篇文章中的所有…

什么是程序員正確的職場心態?

(本文為《程序員羊皮卷》最新公布的第七章的一部分,下載地址:http://download.csdn.net/source/1868065 或者http://zhaopinpro.com/wordpress/wp-content/uploads/2009/12/《程序員羊皮卷》第7章-程序員職場心態.doc 歡迎大家購買作者簽名…

git第一次提交代碼至遠程倉庫步驟

git第一次提交代碼至遠程倉庫步驟在將要提交的文件目錄下打開Git Bash Here1.git init git add . 提交該目錄下的所有文件 3.git commit -am “qiantai”(提交到本地倉庫) 4.git remote add origin *** (***git地址) 5.git push -u -f origin master(提交到遠程倉庫&#x…