از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ویژگی مقیاسبندی داده با Scikit-Learn برای یادگیری ماشین در پایتون
سرفصلهای مطلب
معرفی
پیش پردازش داده ها یک مرحله کلیدی در یادگیری ماشینی است که اغلب نادیده گرفته می شود. در واقع – این است به عنوان مهم به عنوان مدل براقی که می خواهید با آن تناسب داشته باشید.
زباله در – زباله بیرون.
می توانید داشته باشید بهترین مدلی که برای هر مشکلی ساخته شده است – اگر به آن زباله بدهید، زبالهها را بیرون میریزد. شایان ذکر است که “زباله” به داده های تصادفی اشاره نمی کند. این برچسب سختی است که ما به هر داده ای می چسبانیم که به مدل اجازه نمی دهد بهترین کار را انجام دهد – برخی بیشتر از دیگران. همانطور که گفته شد – همان داده ها می تواند برای یک مدل بد باشد، اما برای مدل دیگر عالی است. بطور کلی، مدل های مختلف یادگیری ماشین نیز تعمیم نمی دهند روی دادهها با واریانس مقیاس بالا، بنابراین معمولاً میخواهید قبل از وارد کردن آن به مدل، آنها را اتو کنید.
عادی سازی و استاندارد سازی دو تکنیکی هستند که معمولا در طول استفاده می شوند پیش پردازش داده ها برای تنظیم ویژگی ها در یک مقیاس مشترک.
در این راهنما، ما به این می پردازیم که مقیاس بندی ویژگی چیست و ویژگی های یک مجموعه داده را به مقیاس مناسب تر مقیاس می دهیم. سپس، ما یک را آموزش خواهیم داد SGDRegressor
مدل روی داده های اصلی و مقیاس بندی شده برای بررسی اینکه آیا تأثیر زیادی داشته است یا خیر روی این مجموعه داده خاص
مقیاس بندی ویژگی چیست – عادی سازی و استانداردسازی
مقیاس بندی یا مقیاس بندی ویژگی ها هست process تغییر مقیاس ویژگی های خاص به یک مقیاس مشترک. این معمولاً از طریق به دست می آید عادی سازی و استاندارد سازی (تکنیک های مقیاس بندی).
- عادی سازی هست process مقیاس بندی داده ها در محدوده (0، 1). برای کارهای رگرسیون مفیدتر و رایج تر است.
$$
x’ = \frac{x-x_{min}}{x_{max} – x_{min}}
$$
- استاندارد سازی هست process از مقیاس بندی داده ها به طوری که آنها یک مقدار متوسط 0 و الف انحراف معیار 1. برای کارهای طبقه بندی مفیدتر و رایج تر است.
$$
x’ = \frac{x-\mu}{\sigma}
$$
توزیع نرمال با این مقادیر a نامیده می شود توزیع نرمال استاندارد.
شایان ذکر است که استانداردسازی داده ها تضمین نمی کند که در محدوده (0، 1) قرار دارند. به احتمال زیاد اینطور نخواهد بود – که می تواند برای الگوریتم های خاصی که انتظار این محدوده را دارند مشکل ساز باشد.
برای انجام استانداردسازی، Scikit-Learn به ما ارائه می دهد StandardScaler
کلاس
عادی سازی نیز به عنوان شناخته شده است مقیاس حداقل حداکثری و Scikit-Learn فراهم می کند MinMaxScaler
به این منظور. از طرفی الف را نیز فراهم می کند Normalizer
، که می تواند اوضاع را کمی گیج کننده کند.
توجه داشته باشید: این Normalizer
کلاس اجرا نمی کند همان مقیاس بندی MinMaxScaler
. Normalizer
آثار روی ردیف هاویژگی ها نیست، و آنها را به طور مستقل مقیاس می کند.
چه زمانی باید مقیاس بندی ویژگی ها را انجام داد؟
مقیاس گذاری ویژگی این کار را نمی کند ضمانت عملکرد مدل بهتر برای همه مدل ها.
به عنوان مثال، اگر مقیاس اهمیتی نداشته باشد، «مقیاسسازی ویژگی» کار چندانی انجام نمیدهد. برای K-Means Clustering، فاصله اقلیدسی مهم است، بنابراین مقیاس بندی ویژگی تأثیر زیادی دارد. همچنین برای هر الگوریتمی که متکی است تأثیر زیادی می گذارد روی گرادیان ها، مانند مدل های خطی که با به حداقل رساندن تلفات برازش می شوند گرادیان نزول.
تجزیه و تحلیل اجزای اصلی (PCA) همچنین از داده هایی رنج می برد که به درستی مقیاس بندی نشده اند.
در مورد Scikit-Learn – هیچ تفاوت محسوسی با a نخواهید دید LinearRegression
، اما تفاوت قابل توجهی با a خواهد دید SGDRegressor
، زیرا الف SGDRegressor
که یک مدل خطی نیز می باشد، بستگی دارد روی نزول گرادیان تصادفی برای تناسب با پارامترها
آ مدل درختی از داده های مقیاس نشده رنج نخواهند برد، زیرا مقیاس به هیچ وجه بر آنها تأثیر نمی گذارد، اما اگر انجام دهید افزایش گرادیان روی طبقه بندی کننده ها، مقیاس میکند یادگیری را تحت تاثیر قرار دهد.
واردات داده ها و تجزیه و تحلیل داده های اکتشافی
ما با آن کار خواهیم کرد مجموعه داده مسکن ایمز که شامل 79 ویژگی در مورد خانه های فروخته شده در ایمز، آیووا و همچنین قیمت فروش آنها است. این یک مجموعه داده عالی برای آموزش رگرسیون اولیه و پیشرفته است، زیرا ویژگیهای زیادی برای دستکاری و کمانچه وجود دارد که در نهایت معمولاً به طریقی بر قیمت فروش تأثیر میگذارند.
اجازه دهید import داده ها و نگاهی به برخی از ویژگی هایی که استفاده خواهیم کرد:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('AmesHousing.csv')
x = df(('Gr Liv Area', 'Overall Qual')).values
y = df('SalePrice').values
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax(0).scatter(x(:,0), y)
ax(1).scatter(x(:,1), y)
plt.show()
یک همبستگی مثبت قوی بین “Gr Liv Area” ویژگی و “قیمت فروش” ویژگی – تنها با چند نقطه پرت. همچنین یک همبستگی مثبت قوی بین “کلی کیفی” ویژگی و “قیمت فروش”:
گرچه اینها هستند روی مقیاس بسیار متفاوت – “منطقه Gr liv” تا 5000 ~ (اندازه گیری شده در فوت مربع)، در حالی که “کلی کیفی” ویژگی تا 10 (دسته بندی مجزا از کیفیت) را پوشش می دهد. اگر بخواهیم این دو را طرح کنیم روی همان محورها، ما نمی توانیم چیز زیادی در مورد آن بگوییم “کلی کیفی” ویژگی:
fig, ax = plt.subplots(figsize=(12, 4))
ax.scatter(x(:,0), y)
ax.scatter(x(:,1), y)
علاوه بر این، اگر بخواهیم توزیع آنها را ترسیم کنیم، شانس زیادی هم نخواهیم داشت:
fig, ax = plt.subplots(figsize=(12, 4))
ax.hist(x(:,0))
ax.hist(x(:,1))
مقیاس این ویژگیها به قدری متفاوت است که ما نمیتوانیم با ترسیم آنها در کنار هم چیز زیادی به دست آوریم. این جایی است که مقیاس بندی ویژگی شروع می شود.
معیارهای
این StandardScaler
کلاس برای تبدیل داده ها توسط استفاده می شود استاندارد کردن آی تی. اجازه دهید import آن و مقیاس داده ها از طریق آن fit_transform()
روش:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
fig, ax = plt.subplots(figsize=(12, 4))
scaler = StandardScaler()
x_std = scaler.fit_transform(x)
ax.hist(x_std(:,0))
ax.hist(x_std(:,1))
توجه داشته باشید: ما استفاده می کنیم fit_transform()
روی کل مجموعه داده در اینجا برای نشان دادن استفاده از StandardScaler
کلاس و اثرات آن را تجسم کنید. هنگام ساخت یک مدل یا خط لوله، همانطور که به زودی خواهیم کرد – نباید انجام دهید fit_transform()
کل مجموعه داده، بلکه فقط fit()
داده های آموزش ، و transform()
داده های تست
اجرای این قطعه کد، مقدار را محاسبه می کند μ و σ پارامترها – این process شناخته شده است برازش داده ها، و سپس آن را تبدیل کند به طوری که این مقادیر مطابقت دارند 1 و 0 به ترتیب.
وقتی توزیع این ویژگی ها را اکنون ترسیم می کنیم، با طرح بسیار قابل مدیریت تری مواجه خواهیم شد:
اگر بخواهیم دوباره اینها را از طریق Scatter Plots ترسیم کنیم، شاید به وضوح اثرات استانداردسازی را ببینیم:
fig, ax = plt.subplots(figsize=(12, 4))
scaler = StandardScaler()
x_std = scaler.fit_transform(x)
ax.scatter(x_std(:,0), y)
ax.scatter(x_std(:,1), y)
MinMaxScaler
به عادی کردن ویژگی ها، ما استفاده می کنیم MinMaxScaler
کلاس تقریباً به همان روشی کار می کند StandardScaler
، اما از یک رویکرد اساسی متفاوت برای مقیاس بندی داده ها استفاده می کند:
fig, ax = plt.subplots(figsize=(12, 4))
scaler = MinMaxScaler()
x_minmax = scaler.fit_transform(x)
ax.hist(x_minmax (:,0))
ax.hist(x_minmax (:,1))
آن ها هستند عادی شده است در محدوده (0، 1). اگر بخواهیم دوباره توزیع ها را ترسیم کنیم، با استقبال مواجه می شویم:
این چولگی از توزیع حفظ شده است، بر خلاف با استاندارد سازی که باعث می شود آنها خیلی بیشتر همپوشانی داشته باشند. اگرچه، اگر بخواهیم دوباره داده ها را از طریق Scatter Plots رسم کنیم:
fig, ax = plt.subplots(figsize=(12, 4))
scaler = MinMaxScaler()
x_minmax = scaler.fit_transform(x)
ax.scatter(x_minmax (:,0), y)
ax.scatter(x_minmax (:,1), y)
ما میتوانیم همبستگی مثبت قوی بین هر دوی اینها را ببینیم “قیمت فروش” با ویژگی، اما “کیفیت کلی” ویژگی به طرز عجیبی به سمت راست بیش از حد گسترش می یابد، زیرا نقاط پرت از “Gr Liv Area” ویژگی اکثر توزیع آن را مجبور به دنبال کردن کرد روی سمت چپ
اثرات پرت
هر دو عادی سازی و استاندارد سازی به موارد پرت حساس هستند – کافی است مجموعه داده دارای یک باشد تنها دور از ذهن است که راه وجود دارد تا همه چیز واقعا عجیب و غریب به نظر برسد. بیایید یک ورودی مصنوعی به آن اضافه کنیم “Gr Liv Area” ویژگی برای دیدن اینکه چگونه بر مقیاس بندی تأثیر می گذارد process:
fig, ax = plt.subplots(figsize=(12, 4))
scaler = MinMaxScaler()
x_minmax = scaler.fit_transform(x)
ax.scatter(x_minmax (:,0), y)
واحد پرت، روی سمت راست افراطی طرح واقعاً بر توزیع جدید تأثیر گذاشته است. همه از دادهها، به جز خروجی، در دو چارک اول قرار دارد:
fig, ax = plt.subplots(figsize=(12, 4))
scaler = MinMaxScaler()
x_minmax = scaler.fit_transform(x)
ax.hist(x_minmax (:,0))
مقیاس بندی ویژگی از طریق خطوط لوله Scikit-Learn
در نهایت، بیایید پیش برویم و یک مدل با و بدون ویژگی های مقیاس بندی را از قبل آموزش دهیم. هنگام کار روی پروژه های یادگیری ماشین – ما معمولا یک خط لوله برای داده ها قبل از رسیدن به مدلی که ما برازش می کنیم.
ما از Pipeline
کلاسی که به ما امکان می دهد این را به حداقل برسانیم و تا حدی آن را خودکار کنیم process، حتی اگر ما فقط دو مرحله داریم – مقیاس بندی داده ها و برازش یک مدل:
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error
import sklearn.metrics as metrics
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('AmesHousing.csv')
x = df(('Gr Liv Area', 'Overall Qual')).values
y = df('SalePrice').values
X_train, X_test, Y_train, Y_test = train_test_split(x, y)
pipeline = Pipeline((
("MinMax Scaling", MinMaxScaler()),
("SGD Regression", SGDRegressor())
))
pipeline.fit(X_train, Y_train)
Y_pred = pipeline.predict(X_test)
print('Mean Absolute Error: ', mean_absolute_error(Y_pred, Y_test))
print('Score', pipeline.score(X_test, Y_test))
این نتیجه در:
Mean Absolute Error: 27614.031131858766
Score 0.7536086980531018
میانگین خطای مطلق است 27000 ~، و نمره دقت است ~ 75٪. این به این معنی است که روی به طور متوسط، مدل ما قیمت را از دست می دهد 27000 دلار، که چندان بد به نظر نمی رسد، اگرچه می توان آن را فراتر از این بهبود داد.
مهمتر از همه، نوع مدلی که ما استفاده کردیم کمی بیش از حد سفت و سخت است و ویژگیهای زیادی را در آن ارائه نکردهایم، بنابراین قطعاً این دو مکانهایی هستند که میتوان آنها را بهبود بخشید.
با این حال – بیایید تمرکز خود را بر آنچه که به آن علاقه مندیم از دست ندهیم. عملکرد این مدل چگونه است بدون مقیاس بندی ویژگی؟ بیایید خط لوله را تغییر دهیم تا مرحله مقیاس بندی را رد کنیم:
pipeline = Pipeline((
("SGD Regression", SGDRegressor())
))
آنچه اتفاق می افتد ممکن است شما را شگفت زده کند:
Mean Absolute Error: 1260383513716205.8
Score -2.772781517117743e+20
ما رفتیم از ~ 75٪ دقت به ~-3٪ دقت فقط با پرش برای مقیاسبندی ویژگیهای ما. هر الگوریتم یادگیری که بستگی دارد روی مقیاس ویژگیها معمولاً مزایای عمدهای را از مقیاسبندی ویژگی مشاهده میکند. کسانی که این کار را نمی کنند، تفاوت چندانی نخواهند دید.
به عنوان مثال ، اگر ما آموزش می دهیم LinearRegression
روی همین داده ها، با و بدون مقیاس بندی، نتایج غیرقابل توجهی خواهیم دید روی از طرف مقیاس و نتایج مناسب روی از طرف خود مدل:
pipeline1 = Pipeline((
("Linear Regression", LinearRegression())
))
pipeline2 = Pipeline((
("Scaling", StandardScaler()),
("Linear Regression", LinearRegression())
))
pipeline1.fit(X_train, Y_train)
pipeline2.fit(X_train, Y_train)
Y_pred1 = pipeline1.predict(X_test)
Y_pred2 = pipeline2.predict(X_test)
print('Pipeline 1 Mean Absolute Error: ', mean_absolute_error(Y_pred1, Y_test))
print('Pipeline 1 Score', pipeline1.score(X_test, Y_test))
print('Pipeline 2 Mean Absolute Error: ', mean_absolute_error(Y_pred2, Y_test))
print('Pipeline 2 Score', pipeline2.score(X_test, Y_test))
Pipeline 1 Mean Absolute Error: 27706.61376199076
Pipeline 1 Score 0.7641840816646945
Pipeline 2 Mean Absolute Error: 27706.613761990764
Pipeline 2 Score 0.7641840816646945
نتیجه
مقیاس بندی ویژگی است process مقیاس بندی مقادیر ویژگی ها به مقیاسی قابل مدیریت تر. معمولاً قبل از وارد کردن این ویژگیها به الگوریتمهایی که تحت تأثیر مقیاس هستند، در مرحله پیشپردازش، آن را انجام میدهید.
در این راهنما، ما نگاهی انداختهایم به اینکه مقیاسبندی ویژگی چیست و چگونه آن را در پایتون با Scikit-Learn انجام دهیم، با استفاده از StandardScaler
برای انجام استاندارد سازی و MinMaxScaler
برای انجام عادی سازی. ما همچنین نگاهی به چگونگی تأثیر عوامل پرت بر این فرآیندها و تفاوت بین یک مدل حساس به مقیاس که با و بدون مقیاسگذاری ویژگی آموزش داده میشود، انداختهایم.
(برچسبها به ترجمه)# python(T)# Learning Machine (T)# Data Science
منتشر شده در 1403-01-09 22:25:04