目次
2.2 データセットの説明、特性、データ項目の数、および特徴の数を表示する
2.3 pandas DataFrameにデータを読み込み、csvファイルに転送する
2.4 データセットの各特徴のタイプと null 値の有無を表示する
2.5 データセットの一元的な測定: 各特徴の中央値と平均値を計算し、中央値と平均値を分析します。
2.6 データセットの離散化測定: 最初の特徴に対して箱ひげ図 (箱ひげ図) を描画し、孤立点 (外れ値) をチェックします。
2.7 すべての特徴について箱ひげ図 (ボックス プロット) を描画し、孤立点 (外れ値) を確認する
2.12 局所回帰 (Loess) 曲線を使用して最初の特性データをフィッティングする (散布図を曲線でフィッティングする) 方法
2.13 3 番目の特徴について 2 つのセグメントに分位数-分位数図を描画します
2.14 ヒストグラムを描いて各特徴の分布とデータの偏りを表示する
2.15 すべての特徴のヒストグラムを描画して、データの分布とデータの偏りを表示します。
2.16 すべての特徴間の相関を見つけて、相関が 0.7 より大きい特徴ペアを見つけて、特徴削減を実行します。
3. シミュレーション トレーニング用のボストンの住宅価格データ (データ セット 7:3 の分割)
3.2 データセットを列ごとに正規化し、トレーニングに勾配降下法アルゴリズムを使用し、トレーニングセットの適合度およびテストセットの適合度を表示します。
要約する
序文
データ前処理のプロセスとステップに従って、ボストンの住宅価格データセットに対してデータ前処理とモデルトレーニングを実行し(データセットはトレーニングセットとテストセットに分割する必要があります)、モデルトレーニング中にデータ列の正規化と特徴削減を実行します。特徴抽出およびその他のデータ前処理操作では、高スコアのモデルをトレーニングした後、テスト セットでテストし、テスト セットで精度を検証します。過去数日間更新がない場合は、データの前処理やその他の大きな仕事を行っています。ようやく完成しました。みんなで勉強して議論できるように投稿してください。不備があればコメントしてください。一緒に学びましょう~
1. データ前処理の定義
データ前処理とは、知識獲得研究のためのマイニングアルゴリズムに必要な最小限の仕様と基準を満たすために、データマイニングの前に元データのクリーニング、収集、変換などの一連の処理タスクを指します。データの前処理により、不完全なデータを完全にし、間違ったデータを修正し、冗長なデータを削除し、必要なデータをデータに統合することができます。データ前処理の一般的な方法には、データ クリーニング、データ統合、データ変換などがあります。
全体的なフローチャートを次の図に示します。
2. データ前処理用のボストン住宅価格データ
2.1 ボストンの住宅価格データセットをダウンロードする
コード:
from sklearn.datasets import load_boston
housing = load_boston()
print(housing.keys())
レンダリング:
2.2 データセットの説明、特性、データ項目の数、および特徴の数を表示する
コード:
print(housing.DESCR)
print(housing.feature_names)
X=housing.data
print(X.shape,X)
y=housing.target
print(y.shape,y)
レンダリング:
分析: ボストンの住宅価格には 506 個のデータと 13 の特徴があることがわかります。
各機能の中国語の意味は次のとおりです。
CRIM: 一人当たりの都市犯罪率
ZN: 住宅地の割合
INDUS: 都市の非商業地の割合
CHAS: 回帰分析用のチャールズ川ダミー変数
NOX: 環境指数
RM: 住居ごとの部屋数
AGE: 1940 年前に建築された所有者の割合-占有ユニット数
DIS: ボストンの 5 つの雇用センターまでの加重距離
RAD: 高速道路の利便性指数
TAX: 10,000 ドルあたりの不動産税率
PTRATIO: 町の教師と生徒の比率
B: 町の都市の黒人の割合
LSTAT: 地区内の地主の数低収入
2.3 pandas DataFrameにデータを読み込み、csvファイルに転送する
コード:
import pandas as pd
df=pd.DataFrame()
for i in range(X.shape[1]):
df[housing.feature_names[i]]=X[:,i]
df['target']=y
df.to_csv('boston_housing.csv',index=None)
print(df)
レンダリング:
分析: .csv ファイルが生成されてデータが保存され、印刷されたレンダリングが上の図に示されています。
2.4 データセットの各特徴のタイプと null 値の有無を表示する
コード:
print(df.info())
レンダリング:
分析: 上の図から、NULL 値が存在しないことがわかります。
2.5 データセットの一元的な測定: 各特徴の中央値と平均値を計算し、中央値と平均値を分析します。
コード:
print(df.describe())
レンダリング:
分析: 上の図から、ボストンの住宅価格の各特徴の平均値と中央値がわかります。各特徴の平均値と中央値は類似しています。CRIM や ZN などの個別の特徴のみが大きく逸脱しています。
2.6 データセットの離散化測定: 最初の特徴に対して箱ひげ図 (箱ひげ図) を描画し、孤立点 (外れ値) をチェックします。
コード:
plt.boxplot(X[:,0],showmeans=True,meanline=True)
plt.show()
レンダリング:
分析: 最初の特徴の孤立点が多くあり、これは平均分析と中央値分析で同じであり、偏差が深刻です。
2.7 すべての特徴について箱ひげ図 (ボックス プロット) を描画し、孤立点 (外れ値) を確認する
コード:
plt.figure(figsize=(15, 15))
#对所有特征(收入中位数)画盒图(箱线图)
for i in range(X.shape[1]):
plt.subplot(4,4,i+1)
plt.boxplot(X[:,i],showmeans = True ,meanline = True)
#x,y坐标轴标签
plt.xlabel(housing['feature_names'][i])
plt.subplot(4,4,14)
#绘制直方图
plt.boxplot(y, showmeans = True ,meanline = True)
#x,y坐标轴标签
plt.xlabel('target')
plt.show()
レンダリング:
分析: ほとんどの特徴には外れ値がなく、個々の特徴のみに外れ値があることもわかります。各特徴の平均値と中央値からもわかります。
2.8 最初の特徴を並べ替えた後に散布図を描画する
コード:
x_sorted=np.sort(df.iloc[:,0].values)
# 画散点图
plt.scatter([i for i in range(X.shape[0])],x_sorted)
# 画x,y坐标轴标签
plt.xlabel('Count')
plt.ylabel('sorted'+housing['feature_names'][0])
plt.show()
レンダリング:
分析: 一人当たりの犯罪率から判断すると、ほとんどの犯罪率はほぼゼロですが、犯罪率が 80% に達するものもあります。
2.9 最初の特徴の分位マップを描画する
コード:
x_sorted=np.sort(df.iloc[:,0].values)
# 画散点图
plt.scatter([i for i in range(X.shape[0])],x_sorted)
# 画中位数点
plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],
[np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),np.quantile(x_sorted,0.75)],color='red')
# 画x,y坐标轴标签
plt.xlabel('Count')
plt.ylabel('sorted'+housing['feature_names'][0])
plt.show()
レンダリング:
分析: この図から、人口の 75% の犯罪率はほぼゼロであり、人口の 25% の犯罪率が比較的高いことがわかります。
2.10 すべての特徴の分位点プロットを描画する
コード:
plt.figure(figsize=(10, 10))
for j in range(X.shape[1]):
# 对第一个特征(收入中位数)数据排序
x_sorted=np.sort(df.iloc[:,j].values)
plt.subplot(4,4,j+1)
# 画散点图
plt.scatter([i for i in range(X.shape[0])],x_sorted)
# 画中位数点
plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],
[np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),np.quantile(x_sorted,0.75)],color='red')
# 画x,y坐标轴标签
plt.xlabel('Count')
plt.ylabel('sorted'+housing['feature_names'][j])
plt.subplot(4,4,13)
plt.show()
レンダリング:
分析:グラフから各特徴の傾向や割合を分析できます。
2.11 線形回帰法を使用した最初の特徴のフィッティング
コード:
X_list=[i for i in range(X.shape[0])]
X_array=np.array(X_list)
# 转换为矩阵
X_reshape=X_array.reshape(X.shape[0],1)
# 排序
x_sorted=np.sort(df.iloc[:,0].values)
from sklearn import linear_model
linear=linear_model.LinearRegression()
# 进行线性回归拟合
linear.fit(X_reshape,x_sorted)
# 对训练结果做拟合度评分
print("training score: ",linear.score(X_reshape,x_sorted))
plt.scatter(X_list,x_sorted)
y_predict=linear.predict(X_reshape)
plt.plot(X_reshape,y_predict,color='red')
plt.show()
レンダリング:
分析: 線形回帰を使用した最初の特徴スコアの適合は 33.9% であり、適合度は高くありません
2.12 局所回帰 (Loess) 曲線を使用して最初の特性データをフィッティングする (散布図を曲線でフィッティングする) 方法
コード:
X_list=[i for i in range(X.shape[0])]
X_array=np.array(X_list)
# 转换为矩阵
X_reshape=X_array.reshape(X.shape[0],1)
# 排序
x_sorted=np.sort(df.iloc[:,0].values)
from sklearn import linear_model
# linear=linear_model.LinearRegression()
linear=linear_model.Lasso(fit_intercept=False)
# 进行Lasso局部回归拟合
linear.fit(X_reshape,x_sorted)
# 对训练结果做拟合度评分
print("training score: ",linear.score(X_reshape,x_sorted))
plt.scatter(X_list,x_sorted)
y_predict=linear.predict(X_reshape)
plt.plot(X_reshape,y_predict,color='red')
plt.show()
レンダリング:
分析: 局所回帰曲線を使用した最初の特徴スコアの適合率は 25.3% であり、適合度は高くありません。
2.13 3 番目の特徴について 2 つのセグメントに分位数-分位数図を描画します
コード:
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
df_new1=df[df['INDUS']<=df['INDUS'].mean()]
df_new2=df[df['INDUS']>df['INDUS'].mean()]
part1=np.sort(df_new1.iloc[:,0].values)[:df_new2['INDUS'].count()]
part2=np.sort(df_new2.iloc[:,0].values)[:df_new2['INDUS'].count()]
plt.xlim(part2[0],part2[-1])
plt.ylim(part2[0],part2[-1])
plt.plot([part2[0],part2[-1]],[part2[0],part2[-1]])
plt.scatter(part1,part2)
plt.scatter([np.quantile(part1,0.25),np.quantile(part1,0.5),np.quantile(part1,0.75)],
[np.quantile(part2,0.25),np.quantile(part2,0.5),np.quantile(part2,0.75)],color='red')
plt.show()
レンダリング:
分析: 分位数-分位数図により、すべてがそれを上回っていることがわかります。人口の 75% の一人当たりの犯罪率は 10% 未満であり、人口の 25% の犯罪率は 10% を超えています。 。
2.14 ヒストグラムを描いて各特徴の分布とデータの偏りを表示する
コード:
plt.hist(X[:,0],edgecolor='k')
plt.show()
レンダリング:
分析: 上記の状況はヒストグラムからも確認できます。一人当たりの犯罪率は大多数がゼロです。これは現実の生活とも一致していますが、市内の犯罪率は比較的高いです。
2.15 すべての特徴のヒストグラムを描画して、データの分布とデータの偏りを表示します。
コード:
plt.figure(figsize=(10, 10))
for i in range(X.shape[1]):
plt.subplot(4,4,i+1)
plt.hist(X[:,i],edgecolor='k')
plt.subplot(4,4,14)
plt.hist(y,edgecolor='k')
plt.show()
レンダリング:
2.16 すべての特徴間の相関を見つけて、相関が 0.7 より大きい特徴ペアを見つけて、特徴削減を実行します。
コード:
for column in df.columns:
correlations_data=df.corr()[column].sort_values()
for key in correlations_data.keys():
if key != column and abs(correlations_data[key]) >= 0.7:
print('%s vs %s:' %(column,key),correlations_data[key])
レンダリング:
分析: 0.7 を超える特徴間の相関の数は比較的大きいです。特徴を選択するときは、データを適切に分析し、不要な特徴を減らすために、特徴間の相関が 0.7 未満であることが最善です。計算時間を短縮します。 。
3. シミュレーション トレーニング用のボストンの住宅価格データ (データ セット 7:3 の分割)
3.1 データセットを 7:3 の比率でトレーニング セットとテスト セットに分割し、すべての特徴 (スライスされていない) のトレーニングに線形回帰アルゴリズムを使用し、トレーニング セットの適合性とテストの適合性を表示します。設定
コード:
X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print('y_train = ', y_train)
print('y_test = ', y_test)
#线性回归
from sklearn import linear_model
model = linear_model.LinearRegression()
# model.fit(wine_X_train,wine_y_train)
# 模型训练及评估
model.fit(X_train,y_train)
print('\nTrain score:',model.score(X_train,y_train))
print('Test score:',model.score(X_test,y_test))
レンダリング:
3.2 データセットを列ごとに正規化し、トレーニングに勾配降下法アルゴリズムを使用し、トレーニングセットの適合度およびテストセットの適合度を表示します。
コード:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# 数据预处理,按列归一化
X_train=preprocessing.scale(X_train)
X_test=preprocessing.scale(X_test)
# 线性回归之梯度下降法
from sklearn import linear_model
model=linear_model.SGDRegressor()
# 模型训练及评估
model.fit(X_train,y_train)
print('\nTrain score:',model.score(X_train,y_train))
print('Test score:',model.score(X_test,y_test))
レンダリング:
3.3 回帰問題に対するランダム フォレスト アルゴリズムの使用: ボストンの住宅価格データ セットをトレーニング セットとテスト セットに 7:3 で分割し、トレーニングにランダム フォレスト リグレッサーを使用し、トレーニング セットの精度とテストセット
コード:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
model = RandomForestRegressor()
# 训练评估
model.fit(X_train,y_train)
print('Train score:%f' % (model.score(X_train,y_train)))
print('Test score:%f' % (model.score(X_test,y_test)))
レンダリング:
3.4 回帰問題に対する GBDT アルゴリズムの使用: ボストンの住宅価格データ セットをトレーニング セットとテスト セットに 7:3 で分割し、トレーニングに GBDT 回帰変数を使用し、トレーニング セットの精度とテストの精度を示します。設定
コード:
housing_X=preprocessing.scale(X)
X_train, X_test, y_train, y_test = train_test_split(housing_X, y, test_size=0.3, random_state=0)
# GBDT算法
from sklearn.ensemble import GradientBoostingRegressor
model=GradientBoostingRegressor(random_state=3)
# 模型训练及评估
model.fit(X_train,y_train)
print('Train score:%f' % (model.score(X_train,y_train)))
print('Test score:%f' % (model.score(X_test,y_test)))
レンダリング:
3.5 回帰問題にはリッジ回帰アルゴリズムを使用します。ボストンの住宅価格データ セットをトレーニング セットとテスト セットに 7:3 で分割し、トレーニングにリッジ回帰アルゴリズムを使用し、トレーニング セットの適合性とテスト セット、sklearn のインポート MSE および MAE メソッドは、平均二乗誤差と平均絶対誤差の評価指標を計算します。
コード:
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=0)
from sklearn import linear_model
model=linear_model.Ridge(alpha=0.3)
model.fit(X_train,y_train)
print("\ntraining score: ",model.score(X_train,y_train))
print("Test score: ",model.score(X_test,y_test))
y_predict=model.predict(X_test)
print("均方误差为: ",mean_squared_error(y_test,y_predict))
print("平均绝对误差为:",mean_absolute_error(y_test,y_predict))
print("R_squared:",r2_score(y_test,y_predict))
レンダリング:
3.6 テスト値と予測値の間のギャップ
コード:
plt.plot(y_test,c="green",label="y_test")
plt.plot(y_predict,c="red",label="y_predict")
plt.legend()
plt.show()
レンダリング:
要約する
この時点で、ボストン データセットのデータ前処理とモデル トレーニングのコードと関連レンダリングを示しました。データの前処理を学習したい場合は、それを Python の scikit-learn パッケージにインポートして、従うことができます。赤ワインのデータセットやアイリスのデータセット、カリフォルニアの住宅価格のデータセットなどもあり、練習に活用できます。その中でも、カリフォルニアの住宅価格に関するデータは数万件にも及ぶ膨大なデータがあり、慣れている人であれば、このデータセットは練習用として非常に適しています。