日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

加州房价预测

發(fā)布時間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加州房价预测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 一、項目概覽
      • 二、劃定問題
      • 三、選擇性能指標(biāo)
      • 四、核實假設(shè)
      • 五、獲取數(shù)據(jù)
      • 六、創(chuàng)建測試集
      • 七、數(shù)據(jù)探索和可視化、發(fā)現(xiàn)規(guī)律
      • 八、查找關(guān)聯(lián)
      • 九、屬性組合實驗
      • 十、為機器學(xué)習(xí)算法準(zhǔn)備數(shù)據(jù)
        • 1、數(shù)據(jù)清洗
        • 2、處理文本和類別屬性
        • 3、添加附加屬性
        • 4、特征縮放
        • 5、轉(zhuǎn)換流水線
      • 十一、選擇并訓(xùn)練模型
        • 1、在訓(xùn)練集上訓(xùn)練和評估
        • 2、利用交叉驗證來評估模型
        • 3、模型微調(diào)
        • 4、用測試集評估系統(tǒng)
        • 5、啟動、監(jiān)控、維護(hù)系統(tǒng)

一、項目概覽

利用加州普查數(shù)據(jù),建立一個加州房價模型。

目標(biāo):模型利用該數(shù)據(jù)進(jìn)行學(xué)習(xí),然后根據(jù)其他指標(biāo),預(yù)測任何街區(qū)的房價中位數(shù)

二、劃定問題

建立模型不可能是最終目標(biāo),而是公司的受益情況,這決定了如何劃分問題,選擇什么算法,評估模型的指標(biāo)和微調(diào)等等

你建立的模型的輸出(一個區(qū)的房價中位數(shù))會傳遞給另一個機器學(xué)習(xí)系統(tǒng),也有其他信號傳入該系統(tǒng),從而確定該地區(qū)是否值得投資。

設(shè)計系統(tǒng):

1、劃定問題:監(jiān)督與否、強化學(xué)習(xí)與否、分類與否、批量學(xué)習(xí)或線上學(xué)習(xí)

2、確定問題:典型的監(jiān)督學(xué)習(xí)任務(wù),多變量的回歸問題,樣本數(shù)據(jù)不多可以使用批量學(xué)習(xí)。

三、選擇性能指標(biāo)

回歸問題的典型指標(biāo)是均方根誤差(RMSE),均方根誤差測量的是系統(tǒng)預(yù)測誤差的標(biāo)準(zhǔn)差:
RMSE(X,h)=1m∑i=1m(h(Xi)?y(i))2RMSE(X,h)=\sqrt{\frac{1}{m}\sum_{i=1}^m(h(X^i)-y^{(i)})^2}RMSE(X,h)=m1?i=1m?(h(Xi)?y(i))2?

四、核實假設(shè)

最好列出并核對迄今做出的假設(shè),這樣可以盡早發(fā)現(xiàn)嚴(yán)重的問題,例如,系統(tǒng)輸出的街區(qū)房價會傳入到下游的機器學(xué)習(xí)系統(tǒng),我們假設(shè)這些價格確實會被當(dāng)做街區(qū)房價使用,但是如果下游系統(tǒng)將價格轉(zhuǎn)化為分類(便宜、昂貴、中等等),然后使用這些分類來進(jìn)行判定的話,就將回歸問題變?yōu)榉诸悊栴},能否獲得準(zhǔn)確的價格已經(jīng)不是很重要了。

五、獲取數(shù)據(jù)

使用pandas加載數(shù)據(jù)的話,獲得一個包含所有數(shù)據(jù)的DataFrame對象,DataFrame對象是表格型的數(shù)據(jù)結(jié)構(gòu),提供有序的列和不同類型的列值。

housing.head():查看前5行

housing.info():方法可以快速查看數(shù)據(jù)的描述,特別是總行數(shù)、每個屬性的類型和非空值的數(shù)量

housing["ocean_proximity"].value_counts():查看非數(shù)值的項,也就是距離大海距離的項包含哪些屬性,每個屬性包含多少個街區(qū)

housing.describe():方法查看數(shù)值屬性的概括(均值、方差、最大最小、分位數(shù)等)

housing.hist():柱狀圖

六、創(chuàng)建測試集

測試集在這個階段就要進(jìn)行分割,因為如果查看了測試集,就會不經(jīng)意的按照測試集中的規(guī)律來選擇某個特定的機器學(xué)習(xí)模型,當(dāng)再使用測試集進(jìn)行誤差評估的時候,就會發(fā)生過擬合,在實際系統(tǒng)中表現(xiàn)很差。

隨機挑選一些實例,一般是數(shù)據(jù)集的20%

1、隨機劃分20%為測試集:

from sklearn.model_selection import train_test_split train_set,test_set=train_test_split(housing,test_size=0.2,random_state=42)

隨機劃分的特點:

隨機的取樣方法,當(dāng)數(shù)據(jù)集很大的時候,尤其是和屬性數(shù)量相比很大的時候,通常是可行的,但是如果數(shù)據(jù)集不大,就會有采樣偏差的風(fēng)險,出現(xiàn)訓(xùn)練和測試數(shù)據(jù)分布差距太大的問題。

當(dāng)一個調(diào)查公司想要對1000個人進(jìn)行調(diào)查,不能是隨機取1000個人,而是要保證有代表性,美國人口的51.3%是女性,48.7%是男性,所以嚴(yán)謹(jǐn)?shù)恼{(diào)查需要保證樣本也是這樣的比例:513名女性,487名男性,這稱為分層采樣。

2、分層抽樣

將人群分成均勻的子分組,稱為分層,從每個分層去取合適數(shù)量的實例,保證測試集對總?cè)藬?shù)具有代表性。

可以利用和最終的房屋價值中位數(shù)的關(guān)聯(lián)最大的特征作為分層抽樣的標(biāo)準(zhǔn)。

此處收入的中位數(shù)對最終結(jié)果的預(yù)測很重要,所以利用不同收入分布來劃分測試集,保證劃分之后,每個收入層級的頻率分布基本保持不變。

收入中位數(shù)是連續(xù)值,利用收入中位數(shù)/1.5,ceil()對值進(jìn)行舍入,以產(chǎn)生離散的分類,然后將所有大于5的分類歸類于分類5

根據(jù)收入分類,進(jìn)行分層采樣,使用sklearn的stratifiedShuffleSplit類

分層抽樣可以使得測試集和原始的數(shù)據(jù)集在重要特征的分布上基本一致。

七、數(shù)據(jù)探索和可視化、發(fā)現(xiàn)規(guī)律

將地理位置、房價等因素和輸出的標(biāo)簽做一個可視化,查看其分布狀況。

八、查找關(guān)聯(lián)

1、person系數(shù)

因為數(shù)據(jù)集并不是很大,所以可以使用corr()的方法來計算出每對屬性間的標(biāo)準(zhǔn)相關(guān)系數(shù),也稱為person相關(guān)系數(shù)

corr_matrix=housing.corr() corr_matrix["median_house_value"].sort_values(ascending=False)

輸出:

median_house_value 1.000000 median_income 0.687160 total_rooms 0.135097 housing_median_age 0.114110 households 0.064506 total_bedrooms 0.047689 population -0.026920 longitude -0.047432 latitude -0.142724 Name: median_house_value, dtype: float64

可以看出median_income和最終的輸出結(jié)果的相關(guān)程度很高

2、scatter_matrix()函數(shù):

可以繪制每個數(shù)值屬性對每個其他數(shù)值屬性的圖,因為現(xiàn)在有11個數(shù)值屬性,可以得到 112=121112=121 張圖,所以只關(guān)注幾個和房價中位數(shù)最有可能相關(guān)的屬性。

最有希望用來預(yù)測房價中位數(shù)的屬性是收入中位數(shù),因此將這張圖放大:

該圖說明了幾點:

  • 首先,相關(guān)性非常高,可以清晰的看到向上的趨勢,并且數(shù)據(jù)點不是很分散

  • 其次,圖中在280000美元、350000美元、450000美元、500000美元都出現(xiàn)了水平線,可以去除對應(yīng)的街區(qū),防止過擬合

九、屬性組合實驗

創(chuàng)建三個新特征:

roomes_per_household

bedrooms_per_rooms

population_per_household

housing["roomes_per_household"]=housing["total_rooms"]/housing["households"] housing["bedrooms_per_rooms"]=housing["total_bedrooms"]/housing["total_rooms"] housing["population_per_household"]=housing["population"]/housing["households"] corr_matrix=housing.corr() corr_matrix["median_house_value"].sort_values(ascending=False)# False:降序

輸出:

median_house_value 1.000000 median_income 0.687160 roomes_per_household 0.146285 total_rooms 0.135097 housing_median_age 0.114110 households 0.064506 total_bedrooms 0.047689 population_per_household -0.021985 population -0.026920 longitude -0.047432 latitude -0.142724 bedrooms_per_rooms -0.259984 Name: median_house_value, dtype: float64

與總房間數(shù)或臥室數(shù)相比,新的特征“每個房子中的臥室數(shù) bedrooms_per_room”屬性與房價中位數(shù)的關(guān)聯(lián)更強,也就是臥室數(shù)/總房間數(shù)的比例越低,房價就越高,每戶的房間數(shù)也比街區(qū)的總房間數(shù)更有信息,也就是房屋越大,房價就越高。

這一步的數(shù)據(jù)探索不必非常完備,此處的目的是有一個正確的開始,快速發(fā)現(xiàn)規(guī)律,以得到一個合理的原型。

十、為機器學(xué)習(xí)算法準(zhǔn)備數(shù)據(jù)

為機器學(xué)習(xí)算法準(zhǔn)備數(shù)據(jù),不用手工來做,你需要寫一些函數(shù),理由如下:

  • 函數(shù)可以讓你在任何數(shù)據(jù)集上方便的進(jìn)行重復(fù)數(shù)據(jù)轉(zhuǎn)換

  • 可以慢慢建立一個轉(zhuǎn)換函數(shù)庫,可以在未來的項目中重復(fù)使用

  • 在將數(shù)據(jù)傳給算法之前,你可以在實時系統(tǒng)中使用這些函數(shù)

  • 可以讓你方便的嘗試多種數(shù)據(jù)轉(zhuǎn)換,查看哪些轉(zhuǎn)換方法結(jié)合起來效果最好

先回到干凈的訓(xùn)練集,將預(yù)測量和標(biāo)簽分開,因為我們不想對預(yù)測量和目標(biāo)值應(yīng)用相同的轉(zhuǎn)換(注意drop創(chuàng)建了一份數(shù)據(jù)的備份,而不影響strat_train_set):

housing=strat_train_set.drop("median_house_value",axis=1) housing_labels=strat_train_set["median_house_value"].copy()

1、數(shù)據(jù)清洗

大多數(shù)機器學(xué)習(xí)算法不能處理缺失的特征,因此創(chuàng)建一些函數(shù)來處理特征缺失的問題,前面的total_bedrooms有一些缺失值,有三個解決問題的方法:

  • 去掉對應(yīng)街區(qū):housing.dropna()

  • 去掉整個屬性:housing.drop()

  • 進(jìn)行賦值(0、平均值、中位數(shù)):housing.fillna(median)

sklearn提供了一個方便的類來處理缺失值:Imputer

  • 首先,創(chuàng)建一個Imputer示例,指定用某屬性的中位數(shù)來替換該屬性所有的缺失值
from sklearn.preprocessing import Imputer imputer=Imputer(strategy="median")
  • 因為只有數(shù)值屬性才能算出中位數(shù),需要創(chuàng)建一份不包括文本屬性ocean_proximity的數(shù)據(jù)副本
housing_num=housing.drop("ocean_proximity",axis=1)
  • 最后,利用fit()方法將imputer實例擬合到訓(xùn)練數(shù)據(jù)
imputer.fit(housing_num)
  • 現(xiàn)在就是用該“訓(xùn)練過的”imputer來對訓(xùn)練集進(jìn)行轉(zhuǎn)換,將缺失值替換為中位數(shù):
X=imputer.transform(housing_num)

2、處理文本和類別屬性

前面,我們丟棄了類別屬性ocean_proximity,因為它是一個文本屬性,不能計算出中位數(shù),大多數(shù)機器學(xué)習(xí)算法喜歡和數(shù)字打交道,所以讓我們把這些文本標(biāo)簽轉(zhuǎn)化為數(shù)字。

① 利用轉(zhuǎn)換器LabelEncoder,將四個值轉(zhuǎn)換為0,1,2,3

這種方法會出現(xiàn)不同的大小影響判斷的情況,所以引入二元屬性。

② 獨熱編碼

3、添加附加屬性

4、特征縮放

屬性量度差距過大的話,機器學(xué)習(xí)性能下降,梯度下降尋找最優(yōu)解的過程不穩(wěn)定且很耗時。

兩種常見的方法讓所有的屬性具有相同的量度:

  • 線性歸一化(MinMaxScalar)

  • 標(biāo)準(zhǔn)化(StandardScalar)

注意:縮放器之能向訓(xùn)練集擬合,而不是向完整的數(shù)據(jù)集,只有這樣才能轉(zhuǎn)化訓(xùn)練集和測試集

5、轉(zhuǎn)換流水線

數(shù)據(jù)處理過程中,存在許多數(shù)據(jù)轉(zhuǎn)換步驟,需要按照一定的順序進(jìn)行執(zhí)行,sklearn提供了類——Pipeline來進(jìn)行一系列轉(zhuǎn)換,

十一、選擇并訓(xùn)練模型

前面限定了問題、獲得了數(shù)據(jù)、探索了數(shù)據(jù)、采樣了測試集,寫了自動化的轉(zhuǎn)換流水線來清理和為算法準(zhǔn)備數(shù)據(jù),現(xiàn)在可以選擇并訓(xùn)練一個機器學(xué)習(xí)模型了。

1、在訓(xùn)練集上訓(xùn)練和評估

(1)線性回歸模型

from sklearn.linear_model import LinearRegression lin_reg=LinearRegression() lin_reg.fit(housing_prepared,housing_labels)

RMSE=68628,結(jié)果并不好,大多數(shù)街區(qū)的房價中位數(shù)位于120000-265000美元之間,因此預(yù)測誤差68628并不能讓人滿意,這是一個欠擬合的例子,所以我們要選擇更好的模型進(jìn)行預(yù)測,也可以添加更多的特征,等等。

(2)決策樹

from sklearn.tree import DecisionTreeRegressor tree_reg=DecisionTreeRegressor() tree_reg.fit(housing_prepared,housing_labels)

RMSE=0,過擬合

2、利用交叉驗證來評估模型

評估決策樹模型的一種方法是用函數(shù)train_test_split來分割訓(xùn)練集,得到一個更小的訓(xùn)練集和一個驗證集,然后用更小的訓(xùn)練集來訓(xùn)練模型,用驗證集進(jìn)行評估。

另一種方法是使用交叉驗證功能,下面的代碼采用了k折交叉驗證(k=10),每次用一個折進(jìn)行評估,用其余九個折進(jìn)行訓(xùn)練,結(jié)果是包含10個評分的數(shù)組。

from sklearn.model_selection import cross_val_score scores=cross_val_score(tree_reg,housing_prepared,housing_labels,scoring="neg_mean_squared_error",cv=10) scores tree_rmse_scores=np.sqrt(-scores)

輸出:

array([ -4.69780143e+09, -4.53079547e+09, -5.09684731e+09,-4.76712153e+09, -5.10478677e+09, -5.49833181e+09,-5.11203877e+09, -4.83185329e+09, -5.95294534e+09,-4.98684497e+09])

查看得分函數(shù):

def display_scores(scores):print("Scores:", scores)print("Mean:", scores.mean())print("Standard deviation:", scores.std()) display_scores(tree_rmse_scores)

輸出:

Scores: [ 68416.06869621 67700.71364388 70107.46534824 68567.8343617671987.47320813 74458.15245677 70294.48853581 71217.5750103476961.44182696 70069.50630652] Mean: 70978.0719395 Standard deviation: 2723.10200089

交叉驗證不僅可以讓你得到模型性能的評估,還能測量評估的準(zhǔn)確性,也就是標(biāo)準(zhǔn)差,決策樹的評分大約是70978,波動為±2723,如果只有一個驗證集就得不到這些信息,但是交叉驗證的代價是訓(xùn)練了模型多次,不可能總是這樣

(3)隨機森林

from sklearn.ensemble import RandomForestRegressorforest_reg=RandomForestRegressor(random_state=42) forest_reg.fit(housing_prepared,housing_labels) from sklearn.model_selection import cross_val_score forest_scores=cross_val_score(forest_reg,housing_prepared,housing_labels,scoring="neg_mean_squared_error",cv=10) forest_rmse_scores=np.sqrt(-forest_scores) display_scores(forest_rmse_scores)

輸出:

Scores: [ 51650.94405471 48920.80645498 52979.16096752 54412.7404202150861.29381163 56488.55699727 51866.90120786 49752.2459953755399.50713191 53309.74548294] Mean: 52564.1902524 Standard deviation: 2301.87380392

隨機森林看起來不錯,但是訓(xùn)練集的評分仍然比驗證集評分低很多,解決過擬合可以通過簡化模型,給模型加限制,或使用更多的訓(xùn)練數(shù)據(jù)來實現(xiàn)。

可以嘗試機器學(xué)習(xí)算法的其他類型的模型(SVM、神經(jīng)網(wǎng)絡(luò)等)

3、模型微調(diào)

假設(shè)現(xiàn)在有了一個列表,列表里有幾個希望的模塊,你現(xiàn)在需要對它們進(jìn)行微調(diào),下面有幾種微調(diào)的方法。

(1)網(wǎng)格搜索

可以使用sklearn的GridSearchCV來做這項搜索工作:

from sklearn.model_selection import GridSearchCVparam_grid=[{'n_estimators':[3,10,30],'max_features':[2,4,6,8]},{'bootstrap':[False],'n_estimators':[3,10],'max_features':[2,3,4]},]# 3棵樹、10棵樹、30棵樹集成 # 最大特征數(shù):2/4/6/8 forest_reg=RandomForestRegressor() grid_search=GridSearchCV(forest_reg,param_grid,cv=5,scoring='neg_mean_squared_error') grid_search.fit(housing_prepared,housing_labels)

注意:

param_grid:

  • 首先評估所有的列在第一個dict中的n_estimators和max_features的3x4=12種組合

  • 之后嘗試第二個dict中超參數(shù)的2x3=6種組合,這次會將超參數(shù)bootstrap設(shè)為False而不是True

總之,網(wǎng)格搜索會探索12+6=18種RandomForestRegressor的超參數(shù)組合,會訓(xùn)練每個模型5次,因為是5折交叉驗證,也就是總共訓(xùn)練18x5=90輪,最終得到最佳參數(shù)組合。

利用grid_search.best_params_得到最佳估計參數(shù):{'max_features': 8, 'n_estimators': 30}

grid_search.best_estimator_也可以得到最佳估計器:

RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,max_features=8, max_leaf_nodes=None, min_impurity_split=1e-07,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, n_estimators=30, n_jobs=1,oob_score=False, random_state=None, verbose=0, warm_start=False)

如果GridSearchCV是以默認(rèn)值refit=True開始運行的,則一旦用了交叉驗證找到了最佳估計器,就會在整個訓(xùn)練集上重新訓(xùn)練。

得到評估得分:

cvres=grid_search.cv_results_ for mean_score,params in zip(cvres["mean_test_score"],cvres["params"]):print(np.sqrt(-mean_score),params)

輸出:

64215.557922 {'n_estimators': 3, 'max_features': 2} 55714.8764381 {'n_estimators': 10, 'max_features': 2} 53079.4656786 {'n_estimators': 30, 'max_features': 2} 60922.7203346 {'n_estimators': 3, 'max_features': 4} 52804.3071875 {'n_estimators': 10, 'max_features': 4} 50617.4676308 {'n_estimators': 30, 'max_features': 4} 59157.2838878 {'n_estimators': 3, 'max_features': 6} 52452.1859118 {'n_estimators': 10, 'max_features': 6} 50004.9240828 {'n_estimators': 30, 'max_features': 6} 58781.2418874 {'n_estimators': 3, 'max_features': 8} 51669.9337736 {'n_estimators': 10, 'max_features': 8} 49905.3850728 {'n_estimators': 30, 'max_features': 8} 62068.9023546 {'bootstrap': False, 'n_estimators': 3, 'max_features': 2} 53842.6681258 {'bootstrap': False, 'n_estimators': 10, 'max_features': 2} 59645.8537753 {'bootstrap': False, 'n_estimators': 3, 'max_features': 3} 52778.2491624 {'bootstrap': False, 'n_estimators': 10, 'max_features': 3} 59149.2314414 {'bootstrap': False, 'n_estimators': 3, 'max_features': 4} 51774.2952583 {'bootstrap': False, 'n_estimators': 10, 'max_features': 4}

該例子中,我們通過設(shè)定超參數(shù)max_features為8,n_estimators為30,得到了最佳方案,RMSE的值為49959,這比之前使用默認(rèn)超參數(shù)的值52634要好。

(2)隨機搜索

當(dāng)探索相對較少的組合時,網(wǎng)格搜索還可以,但是當(dāng)超參數(shù)的搜索空間很大的時候,最好使用RandomizedSearchCV,該類不是嘗試所有可能的組合,而是通過選擇每個超參數(shù)的一個隨機值的特定數(shù)量的隨機組合,該方法有兩個優(yōu)點:

  • 如果你讓隨機搜索運行,比如1000次,它會探索每個超參數(shù)的1000個不同的值,而不是像網(wǎng)格搜索那樣,只搜索每個超參數(shù)的幾個值

  • 可以方便的通過設(shè)定搜索次數(shù),控制超參數(shù)搜索的計算量

(3)集成方法

另一種微調(diào)系統(tǒng)的方法是將表現(xiàn)最好的模型組合起來,組合之后的性能通常要比單獨的模型要好,特別是當(dāng)單獨模型的誤差類型不同的時候。

4、用測試集評估系統(tǒng)

調(diào)節(jié)完系統(tǒng)之后,終于有了一個性能足夠好的系統(tǒng),現(xiàn)在就可以用測試集評估最后的模型了:從測試集得到預(yù)測值和標(biāo)簽

運行full_pipeline轉(zhuǎn)換數(shù)據(jù),調(diào)用transform(),再用測試集評估最終模型:

final_model=grid_search.best_estimator_X_test=strat_test_set.drop("median_house_value",axis=1) y_test=strat_test_set["median_house_value"].copy()X_test_prepared=full_pipeline.transform(X_test) final_predictions=final_model.predict(X_test_prepared) final_mse=mean_squared_error(y_test,final_predictions) final_rmse=np.sqrt(final_mse) final_rmse

輸出:47997.889508495638

5、啟動、監(jiān)控、維護(hù)系統(tǒng)

(1)啟動

需要為實際生產(chǎn)做好準(zhǔn)備,特別是接入輸入數(shù)據(jù)源,并編寫測試

(2)監(jiān)控

需要監(jiān)控代碼,以固定間隔檢測系統(tǒng)的實時表現(xiàn),當(dāng)發(fā)生下降時觸發(fā)警報,這對于捕捉突然的系統(tǒng)崩潰性能下降十分重要,做監(jiān)控很常見,因為模型會隨著數(shù)據(jù)的演化而性能下降,除非模型用新數(shù)據(jù)定期訓(xùn)練。

評估系統(tǒng)的表現(xiàn)需要對預(yù)測值采樣并進(jìn)行評估,通常人為分析,需要將人工評估的流水線植入系統(tǒng)

(3)維護(hù)

數(shù)據(jù)的分布是變化的,數(shù)據(jù)會更新,要通過監(jiān)控來及時的發(fā)現(xiàn)數(shù)據(jù)的變化,做模型的優(yōu)化。

總結(jié)

以上是生活随笔為你收集整理的加州房价预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。